/ Hex Artifact Content
Login

Artifact 75b117045699d59ff5603792e46482032ce98ba4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
3120: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
3130: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
3140: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
3150: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
3160: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
3170: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
3180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
3190: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
31a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
31b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
31c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
31d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
31e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
31f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
3200: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
3210: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
3220: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
3230: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
3240: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
3250: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
3260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
3270: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
3280: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
3290: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
32a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
32b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
32c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
32e0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
32f0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
3300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
3320: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
3330: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
3340: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
3350: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
3360: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
3380: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
3390: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
33a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33b0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
33c0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
33d0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
33e0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
33f0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
3400: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3410: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a  TS_PENDING flag.
3420: 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72  ** may be incorr
3430: 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a  ectly cleared..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
3450: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
3460: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3470: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3490: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
34a0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
34b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
34d0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
34e0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
34f0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
3500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
3510: 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68  Trans>0 );..  wh
3520: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
3530: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3540: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
3550: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
3560: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
3570: 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70  CLUSIVE)==0 || p
3580: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
3590: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
35a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
35b0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
35c0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
35d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
35e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
35f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
3600: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3620: 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c  >iTable!=1 || pL
3630: 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b  ock==&p->lock );
3640: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
3650: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20  ->iTable!=1 ){. 
3660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3670: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
3680: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3690: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
36a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
36b0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
36c0: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
36d0: 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d   & BTS_PENDING)=
36e0: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
36f0: 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  er );.  if( pBt-
3700: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3710: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3720: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3730: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3740: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3750: 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20  NDING);.  }else 
3760: 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  if( pBt->nTransa
3770: 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  ction==2 ){.    
3780: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
37a0: 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c  Btree p is concl
37b0: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
37c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37d0: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
37e0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
37f0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
3800: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
3810: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
3820: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
3830: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
3840: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
3850: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
3860: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
3870: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
3880: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
3890: 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e   set the BTS_PEN
38a0: 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a  DING flag to 0..
38b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
38c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
38d0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
38e0: 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49  , then BTS_PENDI
38f0: 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  NG must.    ** b
3900: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
3910: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
3920: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
3930: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
3940: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  */.    pBt->btsF
3950: 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e  lags &= ~BTS_PEN
3960: 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DING;.  }.}../*.
3970: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3980: 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69   changes all wri
3990: 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te-locks held by
39a0: 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65   Btree p into re
39b0: 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  ad-locks..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61  tic void downgra
39d0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
39e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
39f0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3a00: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3a10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3a20: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c  er==p ){.    BtL
3a30: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20  ock *pLock;.    
3a40: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3a50: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ;.    pBt->btsFl
3a60: 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43  ags &= ~(BTS_EXC
3a70: 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49  LUSIVE|BTS_PENDI
3a80: 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  NG);.    for(pLo
3a90: 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  ck=pBt->pLock; p
3aa0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63  Lock; pLock=pLoc
3ab0: 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  k->pNext){.     
3ac0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3ad0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
3ae0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65   || pLock->pBtre
3af0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c  e==p );.      pL
3b00: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41  ock->eLock = REA
3b10: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
3b20: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
3b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3b40: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
3b50: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
3b60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
3b70: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
3b80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
3b90: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
3ba0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3bb0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
3bc0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
3bd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
3be0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
3bf0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
3c00: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
3c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c20: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
3c30: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
3c40: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
3c50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3c60: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
3c70: 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79  x);.}../* Verify
3c80: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3c90: 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72 65   and the BtShare
3ca0: 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77 68  d agree about wh
3cb0: 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  at is the curren
3cc0: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
3cd0: 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69 73  nnetion. This is
3ce0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73 68   important in sh
3cf0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
3d00: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
3d10: 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
3d20: 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75 74  pointers get out
3d30: 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73 20  -of-sync, it is 
3d40: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f 75  possible for rou
3d50: 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62 74  tines like.** bt
3d60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f  reeInitPage() to
3d70: 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73 74   reference an st
3d80: 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ale connection p
3d90: 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66 65  ointer that refe
3da0: 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63 6f  rences a.** a co
3db0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nnection that ha
3dc0: 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64  s already closed
3dd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3de0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 61  is used inside a
3df0: 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
3e00: 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20 66  ments only and f
3e10: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
3e20: 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69 6e  f double-checkin
3e30: 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65 65  g that the btree
3e40: 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b 65   code.** does ke
3e50: 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ep the database 
3e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3e70: 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ers up-to-date..
3e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  */.static int cu
3e90: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
3ea0: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
3eb0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3ec0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
3ed0: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
3ee0: 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d  ree->db==p->pBt-
3ef0: 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >db);.}.#endif..
3f00: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3f10: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
3f20: 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
3f30: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
3f40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3f50: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
3f60: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
3f70: 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   pBt..*/.#define
3f80: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3f90: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20 28  lowCache(pCur) (
3fa0: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
3fb0: 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
3fc0: 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  l)../*.** Invali
3fd0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3fe0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
3ff0: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
4000: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
4010: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
4020: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
4030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4040: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
4050: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
4060: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
4070: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
4080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
40a0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
40b0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
40c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
40d0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
40e0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
4110: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4120: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
4130: 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
4140: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74   contents of a t
4150: 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c  able.** to inval
4160: 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
4170: 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ob cursors that 
4180: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
4190: 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66  ** row or one of
41a0: 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20   the rows being 
41b0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
41c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  If argument isCl
41d0: 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75 65  earTable is true
41e0: 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  , then the entir
41f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4200: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62  e.** table is ab
4210: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
4220: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
4230: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69  invalidate all i
4240: 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f  ncrblob.** curso
4250: 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72  rs open on any r
4260: 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  ow within the ta
4270: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
4280: 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a  ge pgnoRoot..**.
4290: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
42a0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
42b0: 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c  rTable is false,
42c0: 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69   then the row wi
42d0: 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77  th.** rowid iRow
42e0: 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63   is being replac
42f0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  ed or deleted. I
4300: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4310: 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74  lidate.** only t
4320: 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75  hose incrblob cu
4330: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
4340: 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e  at specific row.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4360: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
4370: 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72  obCursors(.  Btr
4380: 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
4390: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
43a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
43b0: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ck */.  i64 iRow
43c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
43d0: 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68 61  /* The rowid tha
43e0: 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
43f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  ing */.  int isC
4400: 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20 20  learTable       
4410: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20   /* True if all 
4420: 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20 64  rows are being d
4430: 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42  eleted */.){.  B
4440: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66  tCursor *p;.  if
4450: 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63  ( pBtree->hasInc
4460: 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65  rblobCur==0 ) re
4470: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4480: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
4490: 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
44a0: 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49  ;.  pBtree->hasI
44b0: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a  ncrblobCur = 0;.
44c0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
44d0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
44e0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
44f0: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4500: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4510: 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ob)!=0 ){.      
4520: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
4530: 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20  lobCur = 1;.    
4540: 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61 62    if( isClearTab
4550: 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le || p->info.nK
4560: 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20  ey==iRow ){.    
4570: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
4580: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
4590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45a0: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  }.}..#else.  /* 
45b0: 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68  Stub function wh
45c0: 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f  en INCRBLOB is o
45d0: 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66  mitted */.  #def
45e0: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  ine invalidateIn
45f0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c  crblobCursors(x,
4600: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4620: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4630: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4640: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4650: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4660: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4670: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4680: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4690: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
46a0: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
46b0: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
46c0: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
46d0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
46e0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
46f0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4700: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4710: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4720: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4730: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4740: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4750: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4760: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4770: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4780: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4790: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
47a0: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
47b0: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
47c0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
47d0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
47e0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
47f0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4800: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4810: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4820: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4830: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4840: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4850: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4870: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4880: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4890: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
48a0: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
48b0: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
48c0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
48d0: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
48e0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
48f0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4900: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4910: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4920: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4930: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4940: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4950: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4960: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4970: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4980: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4990: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
49a0: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
49b0: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
49c0: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
49d0: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
49e0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
49f0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4a00: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4a10: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4a20: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4a30: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4a40: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4a50: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4a60: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4a70: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4a80: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4a90: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4aa0: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4ab0: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4ac0: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4ad0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4ae0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4af0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4b00: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4b10: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4b20: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4b30: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
4b40: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
4b50: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
4b60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
4b70: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
4b80: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
4b90: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
4ba0: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
4bb0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4bc0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
4bd0: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
4be0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
4bf0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4c00: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
4c10: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
4c20: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
4c30: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
4c40: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
4c50: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4c60: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
4c70: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
4c80: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
4c90: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4ca0: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
4cb0: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
4cc0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
4cd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4ce0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
4cf0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
4d00: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
4d10: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4d20: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
4d30: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4d40: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4d50: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
4d60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
4d70: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4d80: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
4d90: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
4da0: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
4db0: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
4dc0: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
4dd0: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
4de0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
4df0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
4e00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4e10: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
4e20: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4e30: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4e40: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4e50: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4e60: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4e70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4e80: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4e90: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4eb0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4ec0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4ed0: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4ee0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4ef0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4f00: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4f10: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4f20: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4f30: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4f40: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4f50: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4f60: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4f70: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4f80: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4f90: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4fa0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4fb0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4fc0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4fd0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4fe0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4ff0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
5000: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
5010: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
5020: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
5030: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5040: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5050: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5070: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5080: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5090: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
50a0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
50b0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
50c0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
50d0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
50e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
50f0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
5100: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
5110: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
5120: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
5130: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5140: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5150: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5160: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5170: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5180: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5190: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
51a0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
51b0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
51c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
51d0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
51e0: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
51f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
5200: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
5210: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
5220: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
5230: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
5240: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a  Page = -1;.}../*
5250: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70  .** The cursor p
5260: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
5270: 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  y argument must 
5280: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
5290: 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74   entry.** when t
52a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
52b0: 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76  called (i.e. hav
52c0: 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  e eState==CURSOR
52d0: 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a  _VALID). This.**
52e0: 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20   function saves 
52f0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5300: 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62  or key in variab
5310: 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61  les pCur->nKey a
5320: 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79  nd.** pCur->pKey
5330: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
5340: 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
5350: 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69  ssful or an SQLi
5360: 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64  te error .** cod
5370: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
5380: 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
5390: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69   is open on an i
53a0: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
53b0: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  n the integer ke
53c0: 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29  y.** (the rowid)
53d0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43   is stored in pC
53e0: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75  ur->nKey and pCu
53f0: 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20  r->pKey is left 
5400: 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20  set to.** NULL. 
5410: 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
5420: 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69   open on a non-i
5430: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
5440: 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20  n pCur->pKey is 
5450: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5460: 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   to a malloced b
5470: 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79  uffer pCur->nKey
5480: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63   bytes in size c
5490: 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
54a0: 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  e key..*/.static
54b0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b   int saveCursorK
54c0: 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
54d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
54e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
54f0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5500: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5510: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5520: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5530: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5540: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5550: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75  ..  if( pCur->cu
5560: 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  rIntKey ){.    /
5570: 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64  * Only the rowid
5580: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
5590: 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a   a table btree *
55a0: 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  /.    pCur->nKey
55b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
55c0: 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b  ntegerKey(pCur);
55d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
55e0: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74   For an index bt
55f0: 72 65 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f  ree, save the co
5600: 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65  mplete key conte
5610: 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  nt */.    void *
5620: 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e  pKey;.    pCur->
5630: 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  nKey = sqlite3Bt
5640: 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
5650: 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d  Cur);.    pKey =
5660: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5670: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5680: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
56a0: 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75  BtreePayload(pCu
56b0: 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d  r, 0, (int)pCur-
56c0: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
56d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
56e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
56f0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
5700: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
5710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5720: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
5730: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5740: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5750: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
5760: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5770: 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  ( !pCur->curIntK
5780: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
5790: 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  y );.  return rc
57a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
57b0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
57c0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
57d0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
57e0: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
57f0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
5800: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
5810: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
5820: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5830: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  K..**.** The cal
5840: 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
5850: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
5860: 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53  is valid (has eS
5870: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5880: 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ID).** prior to 
5890: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
58a0: 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  tine.  .*/.stati
58b0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
58c0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
58d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
58e0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
58f0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
5900: 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52  r->eState || CUR
5910: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43  SOR_SKIPNEXT==pC
5920: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
5930: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
5940: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
5950: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5960: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
5970: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
5980: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5990: 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  T ){.    pCur->e
59a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
59b0: 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ALID;.  }else{. 
59c0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
59d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  t = 0;.  }..  rc
59e0: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79   = saveCursorKey
59f0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
5a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5a10: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5a20: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5a30: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5a40: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
5a50: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
5a60: 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
5a70: 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
5a80: 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
5a90: 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74  Ovfl|BTCF_AtLast
5aa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5ab0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
5ac0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
5ad0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
5ae0: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
5af0: 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72  sOnList(BtCursor
5b00: 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a  *,Pgno,BtCursor*
5b10: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  );../*.** Save t
5b20: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
5b30: 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63  all cursors (exc
5b40: 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61  ept pExcept) tha
5b50: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  t are open on.**
5b60: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5b70: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
5b80: 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63 75    "Saving the cu
5b90: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d  rsor position" m
5ba0: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
5bb0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5bc0: 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62   btree is rememb
5bd0: 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20 77  ered in such a w
5be0: 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  ay that it can b
5bf0: 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20  e.** moved back 
5c00: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74  to the same spot
5c10: 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65 65   after the btree
5c20: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
5c30: 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
5c40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a  tine is called j
5c50: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5c60: 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  r pExcept is use
5c70: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a  d to modify the.
5c80: 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78  ** table, for ex
5c90: 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65  ample in BtreeDe
5ca0: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5cb0: 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  nsert()..**.** I
5cc0: 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
5cd0: 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
5ce0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
5cf0: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
5d00: 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f   .** cursors sho
5d10: 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20 42  uld have their B
5d20: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
5d30: 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72 65  g set.  The btre
5d40: 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75  eCursor().** rou
5d50: 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68  tine enforces th
5d60: 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72  at rule.  This r
5d70: 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64  outine only need
5d80: 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69  s to be called i
5d90: 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f  n.** the uncommo
5da0: 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78 70  n case when pExp
5db0: 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43 46  ect has the BTCF
5dc0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5dd0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  et..**.** If pEx
5de0: 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69  pect!=NULL and i
5df0: 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f  f no other curso
5e00: 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20  rs are found on 
5e10: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61  the same root-pa
5e20: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ge,.** then the 
5e30: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5e40: 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73  ag on pExpect is
5e50: 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f   cleared, to avo
5e60: 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f  id another.** po
5e70: 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20  intless call to 
5e80: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
5e90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ea0: 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72  on note:  This r
5eb0: 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68  outine merely ch
5ec0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ecks to see if a
5ed0: 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65  ny cursors.** ne
5ee0: 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20  ed to be saved. 
5ef0: 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f   It calls out to
5f00: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5f10: 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75  st() in the (unu
5f20: 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74  sual).** event t
5f30: 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20  hat cursors are 
5f40: 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67  in need to being
5f50: 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   saved..*/.stati
5f60: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
5f70: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
5f80: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
5f90: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
5fa0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
5fb0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
5fc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5fd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5fe0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
5ff0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
6000: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
6010: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
6020: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
6030: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6040: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6050: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6060: 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b  ==iRoot) ) break
6070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
6080: 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f  return saveCurso
6090: 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f  rsOnList(p, iRoo
60a0: 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69  t, pExcept);.  i
60b0: 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45 78  f( pExcept ) pEx
60c0: 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26  cept->curFlags &
60d0: 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  = ~BTCF_Multiple
60e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
60f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
6100: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
6110: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
6120: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
6130: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
6140: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
6150: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
6160: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
6170: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
6180: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
6190: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
61a0: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
61b0: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
61c0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
61d0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
61e0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
61f0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
6200: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
6210: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
6220: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6230: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6240: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6250: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
6260: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
6270: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
6280: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
6290: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
62a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
62b0: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
62c0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
62d0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
62e0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
62f0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
6300: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
6310: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
6320: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6330: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6340: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6350: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
6360: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
6370: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6380: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
6390: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
63a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
63b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
63c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
63d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
63e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
63f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
6400: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6410: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
6420: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
6430: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
6440: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
6450: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
6460: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
6470: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
6480: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
6490: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
64a0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
64b0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
64c0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
64d0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
64e0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
64f0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
6500: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
6510: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
6520: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6530: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
6540: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
6550: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6560: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
6570: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
6580: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
6590: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
65a0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
65b0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
65c0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
65d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
65e0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
65f0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
6600: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
6610: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
6620: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
6630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6640: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
6650: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
6660: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
6670: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
6680: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
6690: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
66a0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
66b0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
66c0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
66d0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
66e0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
66f0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
6700: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
6710: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
6720: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
6730: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
6740: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
6750: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
6760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6770: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
6780: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
6790: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
67a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
67b0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
67c0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
67d0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
67e0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
67f0: 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  */..  if( pKey )
6800: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
6810: 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
6820: 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
6830: 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  y = sqlite3VdbeA
6840: 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
6850: 72 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  rd(pCur->pKeyInf
6860: 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  o);.    if( pIdx
6870: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
6880: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
6890: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
68a0: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
68b0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
68c0: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
68d0: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
68e0: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
68f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  d==0 ){.      rc
6900: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
6910: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
6920: 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a  to moveto_done;.
6930: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6940: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
6950: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
6960: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
6970: 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
6980: 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
6990: 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64   pRes);.moveto_d
69a0: 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b  one:.  if( pIdxK
69b0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
69c0: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
69d0: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78  eyInfo->db, pIdx
69e0: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
69f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6a00: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
6a10: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
6a20: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
6a30: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6a40: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6a50: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6a60: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6a70: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6a80: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6a90: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6aa0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6ab0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6ac0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6ad0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
6ae0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
6af0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
6b00: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
6b10: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
6b20: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6b30: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6b40: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6b50: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6b60: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6b70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  skipNext;.  asse
6b90: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
6ba0: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
6bb0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6bc0: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6bd0: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6be0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6bf0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
6c00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
6c10: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
6c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6c40: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
6c50: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
6c60: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
6c70: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
6c80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6c90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6ca0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6cb0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
6cc0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
6cd0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6ce0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6cf0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
6d00: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
6d10: 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  D );.    pCur->s
6d20: 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e  kipNext |= skipN
6d30: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ext;.    if( pCu
6d40: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
6d50: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d60: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6d70: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6d80: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6d90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6da0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6db0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6dc0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6dd0: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6de0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6df0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6e00: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6e10: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
6e20: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6e30: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
6e40: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e50: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
6e60: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
6e70: 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a  position where.*
6e80: 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c  * it was last pl
6e90: 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65  aced, or has bee
6ea0: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f  n invalidated fo
6eb0: 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73  r any other reas
6ec0: 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63  on..** Cursors c
6ed0: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
6ee0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
6ef0: 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c  inting at is del
6f00: 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d  eted out.** from
6f10: 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72   under them, for
6f20: 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f   example.  Curso
6f30: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76  r might also mov
6f40: 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20  e if a btree.** 
6f50: 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a  is rebalanced..*
6f60: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
6f70: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
6f80: 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69   NULL cursor poi
6f90: 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c  nter returns fal
6fa0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  se..**.** Use th
6fb0: 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74  e separate sqlit
6fc0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
6fd0: 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74  tore() routine t
6fe0: 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73  o restore a curs
6ff0: 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68  or.** back to wh
7000: 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20  ere it ought to 
7010: 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  be if this routi
7020: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e  ne returns true.
7030: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7040: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7050: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
7060: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
7070: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7080: 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
7090: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
70a0: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
70b0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
70c0: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
70d0: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
70e0: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
70f0: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
7100: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
7110: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
7120: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
7130: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
7140: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
7150: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
7160: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
7170: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
7180: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7190: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
71a0: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
71b0: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
71c0: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
71d0: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
71e0: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
71f0: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
7200: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
7210: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
7220: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
7230: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
7240: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
7250: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7260: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7270: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
7280: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7290: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
72a0: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
72b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
72c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
72d0: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
72e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
72f0: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
7300: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
7310: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
7320: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7330: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7340: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
7350: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
7360: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
7370: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
7380: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7390: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
73a0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
73b0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
73c0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
73d0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
73e0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
73f0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7400: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
7410: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7420: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
7430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7450: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7460: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7470: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7480: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7490: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
74a0: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
74b0: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
74c0: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
74d0: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
74e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
74f0: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
7500: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
7510: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
7520: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
7530: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7540: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7550: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7560: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7570: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7580: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7590: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
75a0: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
75b0: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
75c0: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
75d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
75e0: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
75f0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
7600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
7610: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
7620: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
7630: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7640: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7650: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7660: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7670: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7680: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
76a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
76b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
76c0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
76d0: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
76e0: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
76f0: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
7700: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
7710: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
7720: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
7730: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7740: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7750: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7760: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7770: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7780: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7790: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
77a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
77b0: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
77c0: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
77d0: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
77e0: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
77f0: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
7800: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
7810: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
7820: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
7830: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7840: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7850: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7870: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7880: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7890: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
78a0: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
78b0: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
78c0: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
78d0: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
78e0: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
78f0: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
7900: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7910: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
7920: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
7930: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7940: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7950: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7960: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7970: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7980: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7990: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
79a0: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
79b0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
79c0: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
79d0: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
79e0: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
79f0: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
7a00: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
7a10: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
7a20: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
7a30: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
7a40: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
7a50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
7a60: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
7a70: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7a80: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7a90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
7aa0: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
7ab0: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
7ac0: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
7ad0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7ae0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7af0: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
7b00: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
7b10: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
7b20: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7b30: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
7b40: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
7b50: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
7b60: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
7b70: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
7b80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7b90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7ba0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7bb0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
7bc0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7bd0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7be0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7bf0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
7c00: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
7c10: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
7c20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7c40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
7c50: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
7c60: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
7c70: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
7c80: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
7c90: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
7ca0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
7cb0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
7cc0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
7cd0: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
7ce0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
7cf0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
7d00: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7d10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7d20: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7d30: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7d40: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7d50: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7d60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7d70: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7d80: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
7d90: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
7da0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7db0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7dc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7dd0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7de0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7df0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7e00: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7e10: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7e20: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7e30: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7e40: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7e50: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7e60: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7e70: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e80: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e90: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7ea0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7eb0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7ec0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7ed0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7ee0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7ef0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7f00: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7f10: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7f20: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7f30: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7f40: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7f50: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7f60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f70: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7f80: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7f90: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7fa0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7fb0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7fc0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7fd0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7fe0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7ff0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
8000: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
8010: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
8020: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
8030: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8040: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8050: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8060: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8070: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8080: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8090: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
80a0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
80b0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
80c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
80d0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
80e0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
80f0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8100: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
8110: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8120: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
8130: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8140: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
8150: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
8160: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8170: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
8180: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8190: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
81a0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
81b0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
81c0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
81d0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
81e0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
81f0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8200: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8210: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8230: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8240: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8250: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8260: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8270: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8280: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8290: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
82a0: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
82b0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
82c0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
82d0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
82e0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
82f0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8300: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8310: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8320: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
8330: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8340: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8350: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8360: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8370: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8380: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8390: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
83a0: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
83b0: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
83c0: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
83d0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
83e0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
83f0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8400: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8410: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8420: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8430: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8440: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8450: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8460: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8480: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8490: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
84a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
84b0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
84c0: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
84d0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
84e0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
84f0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
8500: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
8510: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
8520: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
8530: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8540: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8550: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8560: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8570: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8580: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8590: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
85a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
85b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
85c0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
85d0: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
85e0: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
85f0: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
8600: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
8610: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
8620: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
8630: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8640: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8650: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8660: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8670: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8680: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
8690: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
86a0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
86b0: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
86c0: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
86d0: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
86e0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
86f0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
8700: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
8710: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
8720: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
8730: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
8740: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8750: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8760: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8770: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8780: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
8790: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
87a0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
87b0: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
87c0: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
87d0: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
87e0: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
87f0: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
8800: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
8810: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
8820: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
8830: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
8840: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
8850: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
8860: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8870: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8880: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
8890: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
88a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
88b0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
88c0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
88d0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88f0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8900: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8910: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8920: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8930: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8940: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
8950: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8960: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8970: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8980: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8990: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
89a0: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
89b0: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
89c0: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
89d0: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
89e0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
89f0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
8a00: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
8a10: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
8a20: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8a30: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8a40: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8a50: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8a60: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
8a70: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
8a80: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
8a90: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8aa0: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8ab0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8ac0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8ad0: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
8ae0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
8af0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
8b00: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
8b10: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
8b20: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
8b30: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8b40: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8b50: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
8b60: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
8b70: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8b80: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
8b90: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8ba0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8bb0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8bc0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8bd0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8be0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
8bf0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
8c00: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
8c10: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
8c20: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
8c30: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8c40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8c50: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
8c60: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
8c70: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8c80: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8c90: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8ca0: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8cb0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
8cc0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8cd0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
8ce0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
8cf0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8d00: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8d10: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
8d20: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8d30: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8d40: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34  al] - pCell) + 4
8d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8d60: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8d70: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8d80: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8d90: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8da0: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
8db0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8dc0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8dd0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8de0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8df0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
8e00: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8e10: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8e20: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8e30: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8e40: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8e50: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8e60: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8e70: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e80: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8e90: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8ea0: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
8eb0: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
8ec0: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
8ed0: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
8ee0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
8ef0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
8f00: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8f10: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8f20: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8f30: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8f50: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8f60: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8f70: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f80: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f90: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8fa0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fc0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8fd0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8fe0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8ff0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9000: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9010: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
9020: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9030: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9040: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9050: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9060: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9070: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
9080: 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65  ize==4 );.#ifnde
9090: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
90a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
90b0: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
90c0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
90d0: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
90e0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
90f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
9100: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
9110: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
9120: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
9130: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9140: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
9150: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9160: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
9170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9180: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
91a0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
91b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
91c0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
91d0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
91e0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
91f0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
9200: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
9210: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
9220: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
9230: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
9240: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
9250: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9260: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9280: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9290: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
92a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92b0: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
92c0: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
92d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
92f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9300: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9310: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
9320: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
9330: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9340: 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73  KeyLeaf );.  ass
9350: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9360: 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  dPtrSize==0 );. 
9370: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a   pIter = pCell;.
9380: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9390: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
93a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
93b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
93c0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
93d0: 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61  2(pIter, nPayloa
93e0: 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d);.  **.  ** Th
93f0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
9400: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
9410: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
9420: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
9430: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9440: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9450: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9460: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9470: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9480: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9490: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
94a0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
94b0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
94c0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d  hile( (*pIter)>=
94d0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
94e0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
94f0: 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  r++;..  /* The n
9500: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
9510: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9520: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9530: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9540: 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34  rint(pIter, (u64
9550: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9560: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9570: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9580: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9590: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
95a0: 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20  iKey = *pIter;. 
95b0: 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20   if( iKey>=0x80 
95c0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
95d0: 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20  = &pIter[7];.   
95e0: 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20   iKey &= 0x7f;. 
95f0: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
9600: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
9610: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9620: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69  & 0x7f);.      i
9630: 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30  f( (*pIter)<0x80
9640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9650: 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20  if( pIter>=pEnd 
9660: 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
9670: 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b  = (iKey<<8) | *+
9680: 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  +pIter;.        
9690: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
96a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72     }.  }.  pIter
96b0: 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  ++;..  pInfo->nK
96c0: 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65  ey = *(i64*)&iKe
96d0: 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  y;.  pInfo->nPay
96e0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
96f0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
9700: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
9710: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9720: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9730: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9740: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9750: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9760: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9770: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9780: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9790: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
97a0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
97b0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
97c0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
97d0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
97e0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
97f0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
9800: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
9810: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
9820: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9830: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9840: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9850: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9860: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9870: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9880: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9890: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
98a0: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
98b0: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
98c0: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
98d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
98e0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
98f0: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
9900: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9910: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9920: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9930: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9950: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9960: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9970: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9980: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9990: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
99a0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
99c0: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
99d0: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
99e0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
99f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9a00: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
9a10: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
9a20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9a30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9a40: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9a50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a60: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9a70: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
9a80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a90: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
9aa0: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
9ab0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9ac0: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9ad0: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9ae0: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9af0: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9b00: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9b10: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9b20: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9b30: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9b40: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9b50: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b60: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9b70: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b90: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
9ba0: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
9bb0: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9bc0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9bd0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9be0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9bf0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9c00: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9c10: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9c20: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9c30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9c40: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9c50: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9c60: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9c70: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9c80: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9c90: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9ca0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9cb0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9cc0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9cd0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9ce0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9cf0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9d00: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9d10: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9d20: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9d30: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9d40: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9d50: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9d60: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9d70: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9d80: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9d90: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9da0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9db0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9dc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9dd0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9de0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9df0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9e00: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9e10: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9e20: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9e30: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9e40: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9e50: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9e60: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9e70: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9e80: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9e90: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9ea0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9eb0: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9ec0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9ed0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9ee0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9ef0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9f00: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9f10: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9f20: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9f30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9f40: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9f50: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9f60: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9f70: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9f80: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9f90: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9fa0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9fb0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9fc0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9fd0: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9fe0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9ff0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
a000: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
a010: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
a020: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
a030: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
a040: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
a050: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
a060: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
a070: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
a080: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
a090: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a0a0: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
a0b0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a0c0: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a0d0: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
a0e0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
a0f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a100: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a110: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a140: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a150: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a190: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a1a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a1b0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a1c0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a1d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a1e0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a1f0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a200: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a210: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a220: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a230: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a240: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a250: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a260: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a270: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a280: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a290: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a2a0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a2b0: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a2c0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a2d0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a2e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a2f0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a300: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a310: 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ..  nSize = *pIt
a320: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
a330: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
a340: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
a350: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
a360: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a370: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
a380: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a390: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a3a0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a3b0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a3c0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a3d0: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
a3e0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
a3f0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
a400: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
a410: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
a420: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
a430: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
a440: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
a450: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
a460: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
a470: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
a480: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
a490: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
a4a0: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
a4b0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
a4c0: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
a4d0: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a4e0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a500: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a510: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a520: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a530: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a540: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
a550: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a560: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
a570: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a580: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
a590: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
a5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
a5b0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a5c0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
a5d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
a5e0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
a5f0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
a600: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
a610: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
a620: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a630: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
a640: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a650: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a660: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
a670: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
a680: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
a690: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
a6a0: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
a6b0: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
a6c0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
a6d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
a6e0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
a6f0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
a700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
a710: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
a720: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a730: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
a740: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a750: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a760: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
a770: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a780: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a790: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7b0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a7c0: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
a7d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a7e0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
a7f0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
a800: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
a810: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
a820: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
a830: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
a840: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
a850: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
a860: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
a870: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
a880: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
a890: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
a8a0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
a8b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
a8c0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
a8d0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
a8e0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
a8f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
a900: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
a910: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
a920: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
a930: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
a940: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
a950: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
a960: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
a970: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
a980: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
a990: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
a9a0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a9b0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a9c0: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
a9d0: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
a9e0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
a9f0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
aa00: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
aa10: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
aa20: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
aa30: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
aa40: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
aa50: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
aa60: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
aa70: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
aa80: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
aa90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
aaa0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aab0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
aac0: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
aad0: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
aae0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
aaf0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
ab00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ab10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ab20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
ab30: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
ab40: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
ab50: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
ab60: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
ab70: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
ab80: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
ab90: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
aba0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
abb0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
abc0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
abd0: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
abe0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
abf0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
ac00: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
ac10: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
ac20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
ac30: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
ac40: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
ac50: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
ac60: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
ac70: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
ac80: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
ac90: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
aca0: 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell[info.nSize-
acb0: 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  4]);.    ptrmapP
acc0: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
acd0: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
ace0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acf0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
ad00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
ad10: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ad20: 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72  ge given. This r
ad30: 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a  outine reorganiz
ad40: 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20  es cells within 
ad50: 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74  the.** page so t
ad60: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
ad70: 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20   free-blocks on 
ad80: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c  the free-block l
ad90: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ist..**.** Param
ada0: 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73  eter nMaxFrag is
adb0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
adc0: 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65  unt of fragmente
add0: 64 20 73 70 61 63 65 20 74 68 61 74 20 6d 61 79  d space that may
ade0: 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69   be.** present i
adf0: 6e 20 74 68 65 20 70 61 67 65 20 61 66 74 65 72  n the page after
ae00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
ae10: 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49  turns..**.** EVI
ae20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38  DENCE-OF: R-4458
ae30: 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d  2-60138 SQLite m
ae40: 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20  ay from time to 
ae50: 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20  time reorganize 
ae60: 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  a.** b-tree page
ae70: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61   so that there a
ae80: 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73  re no freeblocks
ae90: 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74   or fragment byt
aea0: 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65  es, all.** unuse
aeb0: 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74  d bytes are cont
aec0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61  ained in the una
aed0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72  llocated space r
aee0: 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a  egion, and all.*
aef0: 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b  * cells are pack
af00: 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68  ed tightly at th
af10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
af20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
af30: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
af40: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
af50: 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20  int nMaxFrag){. 
af60: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
af70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
af80: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
af90: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
afb0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
afc0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
afd0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
aff0: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
b000: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
b010: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
b020: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b030: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
b040: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
b050: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b060: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
b070: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
b080: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
b090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b0a0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
b0b0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
b0c0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b0e0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b0f0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
b100: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
b110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b120: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b130: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
b140: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b150: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
b160: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
b170: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
b180: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
b190: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
b1a0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
b1b0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b1c0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
b1d0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
b1e0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
b1f0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
b200: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
b210: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
b220: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
b230: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
b240: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b250: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b260: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
b270: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
b280: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
b290: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b2a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
b2b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b2c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b2d0: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
b2e0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
b2f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b300: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
b310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b320: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b330: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b340: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20  );.  temp = 0;. 
b350: 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50   src = data = pP
b360: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
b370: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b380: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
b390: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
b3a0: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
b3b0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
b3c0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
b3d0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
b3e0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65  hdr+3]) );.  iCe
b3f0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b400: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b410: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b420: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b430: 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  eSize;..  /* Thi
b440: 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20  s block handles 
b450: 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f  pages with two o
b460: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f  r fewer free blo
b470: 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67  cks and nMaxFrag
b480: 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66  .  ** or fewer f
b490: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e  ragmented bytes.
b4a0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
b4b0: 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f   is faster to mo
b4c0: 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  ve the.  ** two 
b4d0: 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20  (or one) blocks 
b4e0: 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d  of cells using m
b4f0: 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64  emmove() and add
b500: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20   the required.  
b510: 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61  ** offsets to ea
b520: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
b530: 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
b540: 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20  rray than it is 
b550: 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74  to .  ** reconst
b560: 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20  ruct the entire 
b570: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  page.  */.  if( 
b580: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
b590: 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20  <=nMaxFrag ){.  
b5a0: 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65    int iFree = ge
b5b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b5c0: 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46  +1]);.    if( iF
b5d0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ree ){.      int
b5e0: 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79   iFree2 = get2by
b5f0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29  te(&data[iFree])
b600: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65  ;..      /* page
b610: 46 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20 61  FindSlot() has a
b620: 6c 72 65 61 64 79 20 76 65 72 69 66 69 65 64 20  lready verified 
b630: 74 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  that free blocks
b640: 20 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20 20   are sorted.    
b650: 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66    ** in order of
b660: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
b670: 68 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68 61  he page, and tha
b680: 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e  t no block exten
b690: 64 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73 74  ds.      ** past
b6a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b6b0: 70 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20 74  page. Provided t
b6c0: 68 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f 74  he two free slot
b6d0: 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20  s do not .      
b6e0: 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69 73  ** overlap, this
b6f0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
b700: 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63   the memmove() c
b710: 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  alls below will 
b720: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  not.      ** ove
b730: 72 77 72 69 74 65 20 74 68 65 20 75 73 61 62 6c  rwrite the usabl
b740: 65 53 69 7a 65 20 62 79 74 65 20 62 75 66 66 65  eSize byte buffe
b750: 72 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 64  r, even if the d
b760: 61 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20  atabase page.   
b770: 20 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70 74     ** is corrupt
b780: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
b790: 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c  rt( iFree2==0 ||
b7a0: 20 69 46 72 65 65 32 3e 69 46 72 65 65 20 29 3b   iFree2>iFree );
b7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
b7c0: 46 72 65 65 2b 67 65 74 32 62 79 74 65 28 26 64  Free+get2byte(&d
b7d0: 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d  ata[iFree+2]) <=
b7e0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
b7f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
b800: 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32  ee2==0 || iFree2
b810: 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  +get2byte(&data[
b820: 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73  iFree2+2]) <= us
b830: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  ableSize );..   
b840: 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32     if( 0==iFree2
b850: 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32   || (data[iFree2
b860: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72  ]==0 && data[iFr
b870: 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20  ee2+1]==0) ){.  
b880: 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d        u8 *pEnd =
b890: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
b8a0: 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  t + nCell*2];.  
b8b0: 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b        u8 *pAddr;
b8c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32  .        int sz2
b8d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
b8e0: 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28  t sz = get2byte(
b8f0: 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b  &data[iFree+2]);
b900: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70  .        int top
b910: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b920: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
b930: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
b940: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
b950: 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29  Free+sz>iFree2 )
b960: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b970: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b980: 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74         sz2 = get
b990: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b9a0: 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  e2+2]);.        
b9b0: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 2b    assert( iFree+
b9c0: 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28 69  sz+sz2+iFree2-(i
b9d0: 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62  Free+sz) <= usab
b9e0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
b9f0: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
ba00: 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c  a[iFree+sz+sz2],
ba10: 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d   &data[iFree+sz]
ba20: 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  , iFree2-(iFree+
ba30: 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sz));.          
ba40: 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20  sz += sz2;.     
ba50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72     }.        cbr
ba60: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
ba70: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
ba80: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
ba90: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
baa0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
bab0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
bac0: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
bad0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
bae0: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
baf0: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
bb00: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
bb10: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
bb20: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
bb30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
bb40: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
bb50: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
bb60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
bb70: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
bb80: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
bb90: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
bba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bbb0: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
bbc0: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
bbd0: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
bbe0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
bbf0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
bc00: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
bc10: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
bc20: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
bc30: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
bc40: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
bc50: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
bc60: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
bc70: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
bc80: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
bc90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bca0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
bcb0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bcc0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bcd0: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
bce0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
bcf0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
bd00: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
bd10: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
bd20: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
bd30: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
bd40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
bd50: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bd60: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bd70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bd80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bd90: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
bda0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
bdb0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
bdc0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
bdd0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
bde0: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
bdf0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
be00: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
be10: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
be20: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
be30: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
be40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
be50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
be60: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
be70: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
be80: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
be90: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
bea0: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
beb0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
bec0: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
bed0: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
bee0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
bef0: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
bf00: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
bf10: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
bf20: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
bf30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bf40: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
bf50: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
bf60: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
bf70: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
bf80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bf90: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
bfa0: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
bfb0: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
bfc0: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
bfd0: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
bfe0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
bff0: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
c000: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
c010: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
c020: 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  .. defragment_ou
c030: 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  t:.  if( data[hd
c040: 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46  r+7]+cbrk-iCellF
c050: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
c060: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
c070: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c080: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
c090: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
c0a0: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
c0b0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c0c0: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
c0d0: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
c0e0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
c0f0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
c100: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
c110: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
c120: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c130: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c140: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c150: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
c160: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c170: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
c180: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
c190: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
c1a0: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
c1b0: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
c1c0: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
c1d0: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
c1e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c1f0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
c200: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
c210: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
c220: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
c230: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
c240: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
c250: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
c260: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
c270: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
c280: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
c290: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
c2a0: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
c2b0: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
c2c0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
c2d0: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
c2e0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
c2f0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
c300: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
c310: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
c320: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
c330: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
c340: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
c350: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
c360: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
c370: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
c380: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
c390: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c3a0: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
c3b0: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
c3c0: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
c3d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
c3e0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c3f0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
c400: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
c410: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
c420: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
c430: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
c440: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
c450: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
c460: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
c470: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
c480: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
c490: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
c4a0: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
c4b0: 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pc>0 );.  do{.  
c4c0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
c4d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c4e0: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
c4f0: 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  */.    /* EVIDEN
c500: 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33  CE-OF: R-06866-3
c510: 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20  9125 Freeblocks 
c520: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65  are always conne
c530: 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  cted in order of
c540: 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69  .    ** increasi
c550: 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20  ng offset. */.  
c560: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
c570: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64  ize-4 || pc<iAdd
c580: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  r+4 ){.      *pR
c590: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
c5a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
c5b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
c5c0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
c5d0: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
c5e0: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
c5f0: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
c600: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
c610: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
c620: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
c630: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
c640: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
c650: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
c660: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
c670: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
c680: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
c690: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c6a0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
c6b0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
c6c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
c6d0: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
c6e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
c6f0: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
c700: 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f   pc < pPg->cellO
c710: 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65  ffset+2*pPg->nCe
c720: 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20  ll || size+pc > 
c730: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c740: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
c750: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c760: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c770: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
c780: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
c790: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
c7a0: 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32  F: R-11498-58022
c7b0: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
c7c0: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
c7d0: 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20  he total.       
c7e0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79   ** number of by
c7f0: 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73  tes in fragments
c800: 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20   may not exceed 
c810: 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  60. */.        i
c820: 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e  f( aData[hdr+7]>
c830: 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  57 ) return 0;..
c840: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
c850: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
c860: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
c870: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
c880: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
c890: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
c8a0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
c8b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
c8c0: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
c8d0: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
c8e0: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
c8f0: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
c900: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
c920: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
c930: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
c940: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
c950: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
c960: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
c970: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
c980: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
c990: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
c9a0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
c9b0: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
c9c0: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
c9d0: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
c9e0: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
c9f0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
ca00: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
ca10: 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a   }while( pc );..
ca20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
ca30: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
ca40: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
ca50: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
ca60: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
ca70: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
ca80: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
ca90: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
caa0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
cab0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
cac0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
cad0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
cae0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
caf0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
cb00: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
cb10: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
cb20: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
cb30: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
cb40: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
cb50: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
cb60: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
cb70: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
cb80: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
cb90: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
cba0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
cbb0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
cbc0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
cbd0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
cbe0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
cbf0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
cc00: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
cc10: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
cc20: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
cc30: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
cc40: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
cc50: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
cc60: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
cc70: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
cc80: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
cc90: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
cca0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
ccb0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
ccc0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
ccd0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
cce0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
ccf0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
cd00: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
cd10: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
cd20: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
cd30: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
cd40: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
cd50: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
cd60: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
cd70: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
cd80: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
cd90: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
cdc0: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
cdd0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
cde0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
cdf0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
ce00: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
ce10: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
ce20: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
ce30: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ce40: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
ce50: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
ce60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
ce70: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
ce80: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ce90: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
cea0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
ceb0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
cec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ced0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
cee0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
cef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
cf00: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
cf10: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
cf20: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
cf30: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
cf40: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
cf50: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
cf60: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
cf70: 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74  rt( nByte < (int
cf80: 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  )(pPage->pBt->us
cf90: 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a  ableSize-8) );..
cfa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
cfb0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
cfc0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
cfd0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
cfe0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
cff0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
d000: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
d010: 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20   gap<=65536 );. 
d020: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d030: 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49   R-29356-02391 I
d040: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  f the database u
d050: 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65  ses a 65536-byte
d060: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20   page size.  ** 
d070: 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64  and the reserved
d080: 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28   space is zero (
d090: 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20  the usual value 
d0a0: 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61  for reserved spa
d0b0: 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ce).  ** then th
d0c0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  e cell content o
d0d0: 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74  ffset of an empt
d0e0: 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20  y page wants to 
d0f0: 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48  be 65536..  ** H
d100: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74  owever, that int
d110: 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67  eger is too larg
d120: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69  e to be stored i
d130: 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67  n a 2-byte unsig
d140: 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ned.  ** integer
d150: 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20  , so a value of 
d160: 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73  0 is used in its
d170: 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70   place. */.  top
d180: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d190: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73  a[hdr+5]);.  ass
d1a0: 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70  ert( top<=(int)p
d1b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d1c0: 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76  eSize ); /* Prev
d1d0: 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69  ent by getAndIni
d1e0: 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28  tPage() */.  if(
d1f0: 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20   gap>top ){.    
d200: 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50  if( top==0 && pP
d210: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d220: 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20  Size==65536 ){. 
d230: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
d240: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d250: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d260: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d270: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d280: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
d290: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
d2a0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
d2b0: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
d2c0: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
d2d0: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
d2e0: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
d2f0: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
d300: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
d310: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
d320: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
d330: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
d340: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
d350: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
d360: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
d370: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d380: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
d390: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d3a0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
d3b0: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
d3c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
d3d0: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
d3e0: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
d3f0: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
d400: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
d410: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
d420: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d430: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
d440: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
d450: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
d460: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
d470: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
d480: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d490: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
d4a0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d4b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d4c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
d4d0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
d4e0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
d4f0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
d500: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
d510: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
d520: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
d530: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
d540: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
d550: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
d560: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
d570: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
d580: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
d590: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
d5a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
d5b0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
d5c0: 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e  , MIN(4, pPage->
d5d0: 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65  nFree - (2+nByte
d5e0: 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
d5f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d600: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
d610: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
d620: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
d630: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74  ( gap+2+nByte<=t
d640: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
d650: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
d660: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
d670: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
d680: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
d690: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
d6a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
d6b0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
d6c0: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
d6d0: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
d6e0: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
d6f0: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
d700: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
d710: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
d720: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
d730: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
d740: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
d750: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d760: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
d770: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
d780: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
d790: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
d7a0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
d7b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
d7c0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
d7d0: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
d7e0: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
d7f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d800: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
d810: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
d820: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d830: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
d840: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
d850: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
d860: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
d870: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
d880: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
d890: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
d8a0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
d8b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
d8c0: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
d8d0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
d8e0: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
d8f0: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
d900: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
d910: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
d920: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
d930: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
d940: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
d950: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
d960: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
d970: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
d980: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
d990: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
d9a0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
d9b0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
d9c0: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
d9d0: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
d9e0: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
d9f0: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
da00: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
da10: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
da20: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
da30: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
da40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da50: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
da60: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
da70: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
da80: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
da90: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
daa0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
dab0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
dae0: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
daf0: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
db00: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
db30: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
db40: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
db50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
db80: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
db90: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
dba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
dbc0: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
dbd0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
dbe0: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
dbf0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
dc00: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
dc10: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
dc20: 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70  .  u32 iLast = p
dc30: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
dc40: 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67  eSize-4; /* Larg
dc50: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
dc60: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
dc70: 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53  .  u32 iEnd = iS
dc80: 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20  tart + iSize;   
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
dca0: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
dcb0: 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f  iStart buffer */
dcc0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
dcd0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
dce0: 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65  aData;   /* Page
dcf0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
dd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
dd10: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
dd20: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
dd30: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
dd40: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
dd50: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
dd60: 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61  B || iStart>=pPa
dd70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
dd80: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
dd90: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
dda0: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
ddb0: 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42  End <= pPage->pB
ddc0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
ddd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dde0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
ddf0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
de00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
de10: 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d  ize>=4 );   /* M
de20: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
de30: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
de40: 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74  t( iStart<=iLast
de50: 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72   );..  /* Overwr
de60: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
de70: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
de80: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
de90: 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f  re_delete.  ** o
dea0: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
deb0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
dec0: 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
ded0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
dee0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
def0: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
df00: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  0, iSize);.  }..
df10: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66    /* The list of
df20: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74   freeblocks must
df30: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
df40: 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68   order.  Find th
df50: 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20  e .  ** spot on 
df60: 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69  the list where i
df70: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20  Start should be 
df80: 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  inserted..  */. 
df90: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
dfa0: 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20  rOffset;.  iPtr 
dfb0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28  = hdr + 1;.  if(
dfc0: 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30   data[iPtr+1]==0
dfd0: 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d   && data[iPtr]==
dfe0: 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c  0 ){.    iFreeBl
dff0: 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74  k = 0;  /* Short
e000: 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65  cut for the case
e010: 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69   when the freeli
e020: 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  st is empty */. 
e030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
e040: 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67  e( (iFreeBlk = g
e050: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
e060: 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a  tr]))<iStart ){.
e070: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
e080: 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20  lk<iPtr+4 ){.   
e090: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
e0a0: 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  k==0 ) break;.  
e0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e0c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e0d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e0e0: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
e0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e100: 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20  FreeBlk>iLast ) 
e110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e120: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
e130: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
e140: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
e150: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
e160: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
e170: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
e180: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
e190: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
e1a0: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
e1b0: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
e1c0: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
e1d0: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
e1e0: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
e1f0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
e200: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
e210: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
e220: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
e230: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
e240: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e250: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
e260: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
e270: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
e280: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
e290: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
e2a0: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
e2b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e2c0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e  _BKPT;.      iEn
e2d0: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
e2e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e2f0: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
e300: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
e310: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
e320: 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ize ) return SQL
e330: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e340: 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  ;.      iSize = 
e350: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
e360: 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
e370: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e380: 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
e390: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
e3a0: 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
e3b0: 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
e3c0: 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
e3d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
e3e0: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
e3f0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
e400: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
e410: 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
e420: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
e430: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
e440: 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
e450: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
e460: 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
e470: 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
e480: 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
e490: 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
e4a0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
e4b0: 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
e4c0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
e4d0: 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
e4e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e4f0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e  _BKPT;.        n
e500: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
e510: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
e520: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
e530: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
e540: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
e550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e560: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
e570: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
e580: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e590: 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  PT;.    data[hdr
e5a0: 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20  +7] -= nFrag;.  
e5b0: 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d  }.  if( iStart==
e5c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
e5d0: 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a  dr+5]) ){.    /*
e5e0: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
e5f0: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
e600: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
e610: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
e620: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
e630: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
e640: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
e650: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
e660: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
e670: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
e680: 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68  .    if( iPtr!=h
e690: 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51  dr+1 ) return SQ
e6a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e6b0: 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  T;.    put2byte(
e6c0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46  &data[hdr+1], iF
e6d0: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
e6e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e6f0: 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c  5], iEnd);.  }el
e700: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  se{.    /* Inser
e710: 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c  t the new freebl
e720: 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65  ock into the fre
e730: 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74  elist */.    put
e740: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
e750: 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  ], iStart);.    
e760: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
e770: 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b  Start], iFreeBlk
e780: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
e790: 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c  &data[iStart+2],
e7a0: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
e7b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69  Page->nFree += i
e7c0: 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75  OrigSize;.  retu
e7d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e7e0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
e7f0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
e800: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
e810: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
e820: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
e830: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
e840: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
e850: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
e860: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
e870: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
e880: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
e890: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
e8a0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
e8b0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
e8c0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
e8d0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
e8e0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
e8f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e900: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
e910: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
e920: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
e930: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
e940: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
e950: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
e960: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
e970: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
e980: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
e990: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
e9a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e9b0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
e9c0: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
e9d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
e9e0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
e9f0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ea00: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
ea10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ea20: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ea30: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ea40: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
ea50: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
ea60: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
ea70: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
ea80: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
ea90: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
eaa0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
eab0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
eac0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  ;.  pPage->xCell
ead0: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
eae0: 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  tr;.  pBt = pPag
eaf0: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
eb00: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
eb10: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
eb20: 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  EY) ){.    /* EV
eb30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32  IDENCE-OF: R-072
eb40: 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65  91-35328 A value
eb50: 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65 61   of 5 (0x05) mea
eb60: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
eb70: 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
eb80: 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  r table b-tree p
eb90: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
eba0: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
ebb0: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
ebc0: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
ebd0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d  NCE-OF: R-26900-
ebe0: 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66  09176 A value of
ebf0: 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73   13 (0x0d) means
ec00: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
ec10: 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65     ** leaf table
ec20: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
ec30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
ec40: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
ec50: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d  NTKEY|PTF_LEAF)=
ec60: 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =13 );.    pPage
ec70: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
ec80: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
ec90: 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  f ){.      pPage
eca0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31  ->intKeyLeaf = 1
ecb0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
ecc0: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
ecd0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20  eParseCellPtr;. 
ece0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ecf0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
ed00: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
ed10: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
ed20: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
ed30: 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67  load;.      pPag
ed40: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
ed50: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
ed60: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
ed70: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  }.    pPage->max
ed80: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
ed90: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
eda0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
edb0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
edc0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
edd0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
ede0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
edf0: 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30  OF: R-43316-3730
ee00: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28  8 A value of 2 (
ee10: 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20  0x02) means the 
ee20: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
ee30: 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78  * interior index
ee40: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
ee50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
ee60: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
ee70: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
ee80: 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32  E-OF: R-59615-42
ee90: 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31  828 A value of 1
eea0: 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74  0 (0x0a) means t
eeb0: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
eec0: 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62   ** leaf index b
eed0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
eee0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
eef0: 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41  ZERODATA|PTF_LEA
ef00: 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50  F)==10 );.    pP
ef10: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
ef20: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ef30: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
ef40: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
ef50: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
ef60: 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20  llPtrIndex;.    
ef70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
ef80: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
ef90: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
efa0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
efb0: 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
efc0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
efd0: 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39  F: R-47608-56469
efe0: 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65   Any other value
eff0: 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20   for the b-tree 
f000: 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20  page type is.   
f010: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f   ** an error. */
f020: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f030: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f040: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
f050: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
f060: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
f070: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
f080: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f090: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
f0a0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
f0b0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
f0c0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
f0d0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f0e0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
f0f0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
f100: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
f110: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
f120: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
f130: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
f140: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
f150: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
f160: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
f170: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
f180: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
f190: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
f1a0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
f1b0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
f1c0: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
f1d0: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
f1e0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
f1f0: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
f200: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
f210: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
f220: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
f230: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f240: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
f250: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f260: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
f270: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
f280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f290: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
f2a0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
f2b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f2c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f2d0: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
f2e0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
f2f0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
f300: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
f310: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
f320: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
f330: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
f340: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
f350: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
f360: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
f370: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
f380: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
f390: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
f3a0: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
f3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f3c0: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
f3d0: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
f3e0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
f3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
f400: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
f410: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
f420: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
f430: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
f440: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
f450: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
f460: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
f470: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
f480: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
f490: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
f4a0: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
f4b0: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
f4c0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
f4d0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
f4e0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
f4f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f500: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
f510: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
f520: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
f530: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
f540: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
f550: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
f560: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
f570: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
f580: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
f590: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
f5a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
f5b0: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
f5c0: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
f5d0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
f5e0: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
f5f0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
f600: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
f610: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
f620: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
f630: 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  ta;.    /* EVIDE
f640: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
f650: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
f660: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
f670: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
f680: 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65     ** the b-tree
f690: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
f6a0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
f6b0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
f6c0: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
f6d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f6e0: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
f6f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
f700: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
f710: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
f720: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
f730: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
f740: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
f750: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
f760: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
f770: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
f780: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
f790: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
f7a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
f7b0: 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63  r + 8 + pPage->c
f7c0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
f7d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
f7e0: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
f7f0: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
f800: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
f810: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
f820: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f     pPage->aDataO
f830: 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
f840: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
f850: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f860: 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38  E-OF: R-58015-48
f870: 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65  175 The two-byte
f880: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f890: 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a  et 5 designates.
f8a0: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74      ** the start
f8b0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
f8c0: 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
f8d0: 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
f8e0: 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20   integer is.    
f8f0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
f900: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20  s 65536. */.    
f910: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
f920: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
f930: 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5]);.    /* EVID
f940: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32  ENCE-OF: R-37002
f950: 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62  -32774 The two-b
f960: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f970: 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68  ffset 3 gives th
f980: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
f990: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
f9a0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  page. */.    pPa
f9b0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
f9c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
f9d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
f9e0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
f9f0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
fa00: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
fa10: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
fa20: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
fa30: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
fa40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa50: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fa60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
fa70: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
fa80: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
fa90: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
faa0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d  NCE-OF: R-24089-
fab0: 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20  57979 If a page 
fac0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
fad0: 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  s (which is only
fae0: 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  .    ** possible
faf0: 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65   for a root page
fb00: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74   of a table that
fb10: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
fb20: 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s) then the.    
fb30: 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  ** offset to the
fb40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
fb50: 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68  ea will equal th
fb60: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75  e page size minu
fb70: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74  s the.    ** byt
fb80: 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
fb90: 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  pace. */.    ass
fba0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
fbb0: 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62  l>0 || top==usab
fbc0: 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  leSize || CORRUP
fbd0: 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  T_DB );..    /* 
fbe0: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
fbf0: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
fc00: 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
fc10: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
fc20: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
fc30: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
fc40: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
fc50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
fc60: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
fc70: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
fc80: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
fc90: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
fca0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
fcb0: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
fcc0: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
fcd0: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
fce0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
fcf0: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
fd00: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
fd10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
fd20: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
fd30: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
fd40: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
fd50: 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
fd60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
fd70: 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20  lSizeCk ){.     
fd80: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
fd90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
fda0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
fdb0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
fdc0: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
fdd0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
fde0: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
fdf0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
fe00: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
fe10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
fe20: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
fe30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
fe40: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
fe50: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
fe60: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
fe70: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
fe80: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
fe90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fea0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
feb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
fec0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
fed0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
fee0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
fef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
ff00: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
ff10: 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
ff20: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
ff30: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
ff40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ff50: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
ff60: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
ff70: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
ff80: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
ff90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ffa0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
ffb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ffc0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
ffd0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
ffe0: 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20  +;.    }  ..    
fff0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
10000 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
10010 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  on the page.    
10020 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
10030 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
10040 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
10050 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
10060 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
10070 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
10080 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
10090 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
100a0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
100b0 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65  e no.    ** free
100c0 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70  blocks. */.    p
100d0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
100e0 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
100f0 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
10100 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
10110 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
10120 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
10130 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  space */.    if(
10140 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
10150 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  32 next, size;. 
10160 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10170 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
10180 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10190 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
101a0 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
101b0 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
101c0 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  ere will.       
101d0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
101e0 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
101f0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10200 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
10210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
10220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10230 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
10240 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
10250 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66   1 ){.        if
10260 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
10270 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
10280 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10290 54 5f 42 4b 50 54 3b 20 2f 2a 20 46 72 65 65 62  T_BKPT; /* Freeb
102a0 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
102b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
102c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
102d0 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
102e0 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
102f0 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
10300 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
10310 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 65  ]);.        nFre
10320 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
10330 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
10340 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20  xt<=pc+size+3 ) 
10350 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70  break;.        p
10360 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 20 20  c = next;.      
10370 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  }.      if( next
10380 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  >0 ){.        re
10390 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
103a0 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 46 72  UPT_BKPT;  /* Fr
103b0 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61  eeblock not in a
103c0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  scending order *
103d0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
103e0 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73  if( pc+size>(uns
103f0 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65  igned int)usable
10400 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
10410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10420 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
10430 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65  Last freeblock e
10440 78 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65  xtends past page
10450 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a   end */.      }.
10460 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
10470 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72   this point, nFr
10480 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ee contains the 
10490 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65  sum of the offse
104a0 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
104b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c     ** of the cel
104c0 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
104d0 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
104e0 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
104f0 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  hin.    ** the c
10500 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10510 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
10520 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
10530 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a  able-size.    **
10540 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68   of the page, th
10550 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74  en the page must
10560 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54   be corrupted. T
10570 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20  his check also. 
10580 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20     ** serves to 
10590 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
105a0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
105b0 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
105c0 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61  content.    ** a
105d0 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
105e0 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
105f0 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
10600 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  he page..    */.
10610 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73      if( nFree>us
10620 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10640 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
10650 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
10660 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46  nFree = (u16)(nF
10670 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74  ree - iCellFirst
10680 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
10690 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Init = 1;.  }.  
106a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
106b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
106c0 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
106d0 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
106e0 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
106f0 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
10700 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
10710 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
10720 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
10730 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
10740 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
10750 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
10760 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
10770 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
10780 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
10790 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
107a0 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
107b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
107c0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
107d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
107e0 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
107f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10800 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
10810 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
10820 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
10830 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10840 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
10850 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10860 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
10870 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
10880 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
10890 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
108a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
108b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
108c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
108d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
108e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
108f0 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
10900 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
10910 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
10920 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74   hdr);.  }.  dat
10930 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
10940 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
10950 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54  hdr + ((flags&PT
10960 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20  F_LEAF)==0 ? 12 
10970 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  : 8);.  memset(&
10980 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
10990 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
109a0 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
109b0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
109c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
109d0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
109e0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
109f0 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
10a00 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  );.  decodeFlags
10a10 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
10a20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
10a30 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
10a40 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
10a50 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62   &data[pBt->usab
10a60 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
10a70 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
10a80 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61  ta[first];.  pPa
10a90 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
10aa0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
10ab0 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50  ldPtrSize];.  pP
10ac0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10ad0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
10ae0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
10af0 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
10b00 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
10b10 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
10b20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
10b30 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
10b40 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
10b50 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
10b60 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
10b70 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
10b80 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
10b90 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
10ba0 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
10bb0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
10bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
10bd0 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
10be0 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
10bf0 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
10c00 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
10c10 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
10c20 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
10c30 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
10c40 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
10c50 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67    if( pgno!=pPag
10c60 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  e->pgno ){.    p
10c70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
10c80 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10c90 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
10ca0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
10cb0 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50   pDbPage;.    pP
10cc0 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10cd0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
10ce0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67  = pgno;.    pPag
10cf0 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
10d00 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
10d10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10d20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71  pPage->aData==sq
10d30 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10d40 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
10d50 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
10d60 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
10d70 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10d80 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
10d90 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
10da0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
10db0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
10dc0 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
10dd0 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
10de0 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
10df0 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
10e00 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
10e10 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
10e20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
10e30 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
10e40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
10e50 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
10e60 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
10e70 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
10e80 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
10e90 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
10ea0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
10eb0 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
10ec0 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
10ed0 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
10ee0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10ef0 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
10f00 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
10f10 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
10f20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
10f30 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
10f40 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
10f50 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
10f60 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
10f70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10f80 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10f90 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10fa0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10fb0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10fd0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
10fe0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
10ff0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
11000 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
11010 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
11020 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
11030 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
11040 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
11050 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
11060 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
11070 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
11080 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
11090 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
110a0 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
110b0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
110c0 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
110d0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
110e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
110f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11100 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11120 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
11130 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
11140 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61  **)&pDbPage, fla
11150 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
11160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
11170 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
11180 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
11190 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
111a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
111b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
111c0 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
111d0 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
111e0 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
111f0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
11200 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
11210 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
11220 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
11230 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
11240 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
11250 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
11260 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
11270 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
11280 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
11290 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
112a0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
112b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
112c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
112d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
112e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
112f0 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
11300 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
11310 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
11320 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
11330 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
11340 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
11350 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
11360 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
11370 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
11380 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
11390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
113a0 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
113b0 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
113c0 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
113d0 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
113e0 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
113f0 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67  ic Pgno btreePag
11400 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
11410 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
11420 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33  pBt->nPage;.}.u3
11430 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  2 sqlite3BtreeLa
11440 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29  stPage(Btree *p)
11450 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
11460 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
11470 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
11480 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61  t( ((p->pBt->nPa
11490 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d  ge)&0x8000000)==
114a0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
114b0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
114c0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
114d0 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
114e0 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
114f0 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11500 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11510 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11520 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11530 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11540 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11550 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11560 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11570 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
11580 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
11590 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
115a0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
115b0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
115c0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
115d0 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
115e0 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
115f0 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11600 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11610 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11620 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11630 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11640 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11650 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11660 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11670 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
11680 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
11690 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
116a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
116b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
116c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
116f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11700 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11720 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11730 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11740 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11760 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11770 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
11780 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
117a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
117b0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
117c0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
117d0 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117f0 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11800 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11820 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11830 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11840 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11850 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11860 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11870 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70  pPage==&pCur->ap
11880 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
11890 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
118a0 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f  Cur==0 || bReadO
118b0 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61  nly==pCur->curPa
118c0 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73  gerFlags );.  as
118d0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
118e0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
118f0 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
11900 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
11910 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
11920 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11930 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
11940 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11950 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
11960 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
11970 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
11980 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
11990 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a  ge, bReadOnly);.
119a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
119b0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
119c0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
119d0 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50   *ppPage = (MemP
119e0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
119f0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11a00 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61  e);.  if( (*ppPa
11a10 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
11a20 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46  {.    btreePageF
11a30 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
11a40 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
11a50 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
11a60 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
11a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11a90 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11aa0 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ge);.      goto 
11ab0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11ac0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
11ad0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
11ae0 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
11af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
11b00 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73  pPage)->aData==s
11b10 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11b20 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  ta(pDbPage) );..
11b30 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e    /* If obtainin
11b40 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66  g a child page f
11b50 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20  or a cursor, we 
11b60 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74  must verify that
11b70 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a   the page is.  *
11b80 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  * compatible wit
11b90 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  h the root page.
11ba0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26   */.  if( pCur &
11bb0 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
11bc0 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
11bd0 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
11be0 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a  ->curIntKey) ){.
11bf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11c10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
11c20 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f  pPage);.    goto
11c30 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11c40 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  error;.  }.  ret
11c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
11c60 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11c70 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72  rror:.  if( pCur
11c80 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d   ) pCur->iPage--
11c90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ;.  testcase( pg
11ca0 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
11cb0 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
11cc0 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
11cd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
11cf0 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
11d00 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
11d10 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
11d20 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
11d30 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
11d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11d50 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
11d60 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
11d70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
11d80 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
11d90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11da0 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
11db0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d  pPage->pDbPage!=
11dc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
11dd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11de0 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
11df0 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
11e00 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
11e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11e20 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
11e30 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
11e40 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
11e50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11e60 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
11e70 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
11e80 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
11e90 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ull(pPage->pDbPa
11ea0 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ge);.}.static vo
11eb0 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
11ec0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
11ed0 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72 65    if( pPage ) re
11ee0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
11ef0 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
11f00 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
11f10 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
11f20 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
11f30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
11f40 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
11f50 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
11f60 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
11f70 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
11f80 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
11f90 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
11fa0 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
11fb0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
11fc0 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
11fd0 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
11fe0 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
11ff0 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
12000 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
12010 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
12020 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
12030 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
12040 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
12050 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
12060 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
12070 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
12080 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
12090 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
120a0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
120b0 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
120c0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
120d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
120e0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
120f0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
12100 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
12110 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
12120 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
12130 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
12140 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12150 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
12160 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
12170 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
12180 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
12190 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
121a0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
121b0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
121c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
121d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
121e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
121f0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
12200 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
12210 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
12220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12230 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
12240 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
12250 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
12260 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
12270 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
12280 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
12290 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
122a0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
122b0 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
122c0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
122d0 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
122e0 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
122f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12300 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
12310 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
12320 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
12330 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
12340 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
12350 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
12360 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
12370 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
12380 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
12390 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
123a0 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
123b0 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
123c0 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
123d0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
123e0 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
123f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
12400 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12410 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
12420 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
12430 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12440 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12450 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12460 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
12470 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
12480 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
12490 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
124a0 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
124b0 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
124c0 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
124d0 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
124e0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
124f0 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
12500 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
12510 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
12520 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
12530 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
12540 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
12550 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
12560 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
12570 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
12580 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
12590 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
125a0 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
125b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
125c0 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
125d0 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
125e0 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
125f0 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
12600 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
12610 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
12620 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
12630 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
12640 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
12650 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12660 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12670 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
12680 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
12690 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
126a0 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
126b0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
126c0 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
126d0 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
126e0 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
126f0 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
12700 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12710 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12720 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
12730 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
12740 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
12750 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
12760 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
12770 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
12780 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
12790 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
127a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
127b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
127c0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
127d0 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
127e0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
127f0 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
12800 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
12810 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
12820 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
12830 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
12840 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
12850 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
12860 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
12870 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
12880 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
12890 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
128a0 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
128b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
128c0 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
128d0 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
128e0 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
128f0 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
12900 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
12910 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
12920 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
12930 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
12940 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
12950 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
12960 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
12970 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
12980 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
12990 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
129a0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
129b0 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
129c0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
129d0 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
129e0 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
129f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12a00 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
12a10 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
12a20 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
12a30 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
12a40 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
12a50 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
12a60 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
12a70 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
12a80 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
12a90 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
12aa0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
12ab0 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
12ac0 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
12ad0 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
12ae0 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
12af0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12b00 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
12b10 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
12b20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
12b30 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
12b40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12b50 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
12b60 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
12b70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
12b80 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
12b90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
12bb0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
12bc0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
12bd0 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
12be0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12bf0 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
12c00 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
12c10 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c30 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
12c40 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
12c50 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
12c60 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
12c70 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
12c80 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
12c90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12cb0 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
12cc0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
12cd0 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
12d00 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
12d10 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
12d20 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
12d30 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
12d40 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
12d50 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
12d60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12d70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12d80 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
12d90 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
12da0 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12dc0 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
12dd0 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
12de0 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
12df0 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
12e00 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
12e10 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
12e20 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
12e30 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
12e40 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
12e50 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
12e60 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
12e70 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
12e80 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
12e90 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
12ea0 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
12eb0 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
12ec0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
12ed0 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
12ee0 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
12ef0 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
12f00 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
12f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
12f20 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
12f30 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
12f40 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
12f50 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
12f60 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
12f70 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
12f80 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
12fb0 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
12fc0 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
12ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
13000 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
13010 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
13020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
13030 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
13040 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13050 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
13060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
13070 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
13080 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
13090 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
130a0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
130b0 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
130c0 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
130d0 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
130e0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
130f0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
13100 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
13110 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
13120 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
13130 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13140 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
13150 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
13160 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
13170 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
13180 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
13190 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
131a0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
131b0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
131c0 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
131d0 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
131e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
131f0 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
13200 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
13210 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
13220 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
13230 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
13240 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
13250 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
13260 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
13270 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
13280 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
13290 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
132a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
132b0 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  PT;.  }.  p->inT
132c0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
132d0 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
132e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
132f0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13300 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
13310 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
13320 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
13330 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
13340 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
13350 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
13360 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13370 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
13380 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
13390 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
133a0 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
133b0 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
133c0 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
133d0 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
133e0 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
133f0 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
13400 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
13410 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
13420 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
13430 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
13440 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
13450 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13460 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
13470 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69  ){.      int nFi
13480 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
13490 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
134a0 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  me)+1;.      int
134b0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
134c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
134d0 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
134e0 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
134f0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d   sqlite3Malloc(M
13500 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  AX(nFullPathname
13510 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  ,nFilename));.  
13520 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13540 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a  mutexShared; )..
13550 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
13560 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
13570 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
13580 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13590 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
135a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
135b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
135c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
135d0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
135e0 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50     memcpy(zFullP
135f0 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  athname, zFilena
13600 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, nFilename);.
13610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13630 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
13640 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
13650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13670 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d      nFullPathnam
13680 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
13690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
136a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  c ){.          s
136b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
136c0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
136d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
136e0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
136f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13700 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
13710 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
13720 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f  AFE.      mutexO
13730 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  pen = sqlite3Mut
13740 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13750 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e  UTEX_STATIC_OPEN
13760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13770 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
13780 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d  exOpen);.      m
13790 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
137a0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
137b0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
137c0 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
137d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
137e0 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
137f0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
13800 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
13810 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
13820 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
13830 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
13840 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
13850 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
13860 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
13870 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
13880 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
13890 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
138a0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
138b0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
138c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
138d0 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
138e0 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
138f0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
13900 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
13910 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
13920 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
13930 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
13940 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
13950 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
13960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
13970 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
13980 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
13990 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
139a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
139b0 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
139c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
139d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
139e0 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13a00 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
13a10 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13a20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13a30 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
13a40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13a50 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
13a70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13a80 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
13a90 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
13aa0 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
13ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13ad0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13ae0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
13af0 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
13b00 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
13b10 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
13b20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
13b30 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
13b40 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
13b50 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
13b60 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
13b70 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
13b80 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
13b90 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
13ba0 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
13bb0 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
13bc0 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
13bd0 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
13be0 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
13bf0 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
13c00 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
13c10 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
13c20 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
13c30 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
13c40 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
13c50 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
13c60 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
13c70 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
13c80 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
13c90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
13ca0 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
13cb0 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
13cc0 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
13cd0 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
13ce0 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
13cf0 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
13d00 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
13d10 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
13d20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
13d30 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
13d40 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
13d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
13d60 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
13d70 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
13d80 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
13d90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13da0 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
13db0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
13dc0 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
13dd0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13de0 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
13df0 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
13e00 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
13e10 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
13e20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
13e30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13e40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
13e50 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
13e60 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
13e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e80 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
13e90 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
13ea0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67     sizeof(MemPag
13ed0 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  e), flags, vfsFl
13ee0 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
13ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13f20 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
13f30 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
13f40 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
13f50 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
13f60 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
13f70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
13f80 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
13f90 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
13fa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13fb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
13fc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13fd0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
13fe0 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
13ff0 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
14000 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
14010 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
14020 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
14030 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
14040 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
14050 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
14060 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
14070 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
14080 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
14090 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
140a0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
140b0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
140c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
140d0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
140e0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
140f0 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42  RE_DELETE.    pB
14100 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14110 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14120 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
14130 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
14140 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
14150 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
14160 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
14170 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
14180 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
14190 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
141a0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
141b0 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
141c0 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
141d0 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
141e0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
141f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
14200 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
14210 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
14220 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
14230 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
14240 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
14250 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
14260 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
14270 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
14280 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
14290 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
142a0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
142b0 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
142c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
142d0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
142e0 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
142f0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
14300 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
14310 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
14320 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
14330 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
14340 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
14350 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
14360 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
14370 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
14380 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
14390 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
143a0 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
143b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
143c0 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
143d0 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
143e0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
143f0 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
14400 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
14410 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
14420 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
14430 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
14440 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
14450 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
14460 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
14470 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
14480 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
14490 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
144a0 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
144b0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
144c0 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
144d0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
144e0 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
144f0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
14500 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
14510 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
14520 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
14530 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
14540 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
14550 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
14560 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  gion is.      **
14570 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
14580 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
14590 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
145a0 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
145b0 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69  of 20.      ** i
145c0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
145d0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
145e0 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
145f0 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
14600 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
14610 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
14620 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
14630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14640 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
14650 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14660 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
14670 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
14680 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
14690 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
146a0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
146b0 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
146c0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
146d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
146e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
146f0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14700 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
14710 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
14720 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
14730 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
14740 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
14750 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
14760 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
14770 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
14780 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
14790 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
147a0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
147b0 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
147c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
147d0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
147e0 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
147f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
14800 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
14810 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
14820 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
14830 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
14840 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
14850 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52    */.    pBt->nR
14860 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ef = 1;.    if( 
14870 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
14880 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
14890 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
148a0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
148b0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
148c0 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
148d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
148e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
148f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
14900 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
14910 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
14920 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14930 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
14940 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
14950 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
14960 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14970 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
14980 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
14990 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
149a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
149b0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
149c0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
149d0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
149e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
149f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14a00 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
14a10 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
14a20 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
14a30 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14a40 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14a50 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
14a60 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14a70 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14a80 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
14a90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14aa0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
14ab0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
14ac0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
14ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
14ae0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
14af0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14b00 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
14b10 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
14b20 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
14b30 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
14b40 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
14b50 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
14b60 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
14b70 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
14b80 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
14b90 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
14ba0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
14bb0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
14bc0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
14bd0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
14be0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
14bf0 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
14c00 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
14c10 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14c20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
14c30 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
14c40 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
14c50 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
14c60 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
14c70 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
14c80 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
14c90 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74          if( (upt
14ca0 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  r)p->pBt<(uptr)p
14cb0 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
14cc0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
14cd0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
14ce0 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
14cf0 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
14d00 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14d20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
14d30 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70  pNext && (uptr)p
14d40 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
14d50 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a  (uptr)p->pBt ){.
14d60 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
14d70 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
14d80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14d90 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
14da0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
14db0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
14dc0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
14dd0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
14de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14df0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
14e00 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
14e10 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
14e20 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
14e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
14e40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14e50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
14e60 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
14e70 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
14e80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14e90 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
14ea0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
14eb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14ec0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
14ed0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
14ee0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
14ef0 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
14f00 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14f10 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
14f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
14f30 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
14f40 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
14f50 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
14f60 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
14f70 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
14f80 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
14f90 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
14fa0 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
14fb0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
14fc0 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
14fd0 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
14fe0 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
14ff0 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
15000 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
15010 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15020 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
15030 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
15040 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15050 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
15060 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
15070 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
15080 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  IZE);.    }..   
15090 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   pFile = sqlite3
150a0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
150b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
150c0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
150d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
150e0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
150f0 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
15100 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64  FCNTL_PDB, (void
15110 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20  *)&pBt->db);.   
15120 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
15130 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
15140 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15150 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
15160 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
15170 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
15180 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
15190 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
151a0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
151b0 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e  3BtreeConnection
151c0 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e  Count(*ppBtree)>
151d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
151e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
151f0 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
15200 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
15210 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
15220 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
15230 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
15240 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
15250 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
15260 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
15270 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
15280 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
15290 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
152a0 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
152b0 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
152c0 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
152d0 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
152e0 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
152f0 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
15300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15310 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
15320 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
15330 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
15340 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
15350 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
15360 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
15370 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15380 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
15390 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
153a0 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
153b0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
153c0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
153d0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
153e0 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
153f0 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
15400 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
15410 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
15420 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
15430 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
15440 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15450 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
15460 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
15470 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
15480 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
15490 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
154a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
154b0 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
154c0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
154d0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
154e0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
154f0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
15500 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
15510 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
15520 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
15530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15540 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
15550 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
15560 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
15570 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
15580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
15590 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
155a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
155b0 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
155c0 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
155d0 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
155e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
155f0 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
15600 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
15610 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
15620 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
15630 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
15640 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15650 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
15660 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
15670 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
15680 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d   bytes with a 4-
15690 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20  byte prefix for 
156a0 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20  a left-child.** 
156b0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
156c0 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
156d0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
156e0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
156f0 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
15700 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
15710 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
15720 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
15730 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
15740 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
15750 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
15760 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
15770 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
15780 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
15790 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
157a0 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
157b0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
157c0 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
157d0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
157e0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
157f0 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
15800 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
15810 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
15820 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
15830 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
15840 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
15850 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
15860 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
15870 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
15880 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
15890 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
158a0 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
158b0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
158c0 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
158d0 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
158e0 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
158f0 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
15900 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
15910 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
15920 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
15930 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
15940 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
15950 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
15960 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
15970 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
15980 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
15990 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
159a0 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
159b0 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
159c0 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
159d0 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a  emp space here..
159e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
159f0 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75  so:  Provide fou
15a00 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69  r bytes of initi
15a10 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66  alized space bef
15a20 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  ore the.    ** b
15a30 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70  eginning of pTmp
15a40 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61  Space as an area
15a50 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72   available to pr
15a60 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  epend the.    **
15a70 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e   left-child poin
15a80 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ter to the begin
15a90 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a  ning of a cell..
15aa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15ab0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15ac0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
15ad0 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
15ae0 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   8);.      pBt->
15af0 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a  pTmpSpace += 4;.
15b00 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15b10 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
15b20 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
15b30 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
15b40 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
15b50 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
15b60 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54  ){.  if( pBt->pT
15b70 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
15b80 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d  Bt->pTmpSpace -=
15b90 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   4;.    sqlite3P
15ba0 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d  ageFree(pBt->pTm
15bb0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74  pSpace);.    pBt
15bc0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
15bd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
15be0 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
15bf0 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
15c00 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
15c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15c20 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
15c30 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
15c40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15c50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15c60 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
15c70 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
15c80 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
15c90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
15ca0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15cb0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15cc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15cd0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
15ce0 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
15cf0 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
15d00 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
15d10 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
15d20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
15d30 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
15d40 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
15d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
15d60 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
15d70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
15d80 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
15d90 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
15da0 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
15db0 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
15dc0 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
15dd0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
15de0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
15df0 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
15e00 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
15e10 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
15e20 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
15e30 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
15e40 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
15e50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15e60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
15e70 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
15e80 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
15e90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
15ea0 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
15eb0 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
15ec0 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
15ed0 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
15ee0 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
15ef0 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
15f00 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
15f10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
15f20 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
15f30 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
15f40 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
15f50 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
15f60 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
15f70 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
15f80 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
15f90 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
15fa0 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
15fb0 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
15fc0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
15fd0 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
15fe0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
15ff0 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
16000 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
16010 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
16020 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
16030 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
16040 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
16050 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
16060 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70  ->db);.    if( p
16070 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
16080 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
16090 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
160a0 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
160b0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
160c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
160d0 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
160e0 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
160f0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
16100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
16110 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
16120 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16130 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
16140 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
16150 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16160 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
16170 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
16180 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
16190 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
161a0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
161b0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
161c0 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
161d0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
161e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
161f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16200 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
16210 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
16220 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16230 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
16240 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
16250 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
16260 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
16270 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
16280 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
16290 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
162a0 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
162b0 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
162c0 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
162d0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
162e0 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
162f0 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
16300 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
16310 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
16320 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
16330 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
16340 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
16350 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16360 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
16370 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16380 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16390 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
163a0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
163b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
163c0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
163d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
163e0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
163f0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
16400 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16410 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16420 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16430 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
16440 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
16450 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
16460 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
16470 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
16480 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
16490 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
164a0 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
164b0 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
164c0 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
164d0 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
164e0 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
164f0 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
16500 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
16510 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
16520 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
16530 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
16540 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
16550 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
16560 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
16570 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
16580 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
16590 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
165a0 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
165b0 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
165c0 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
165d0 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
165e0 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
165f0 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
16600 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
16610 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
16620 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16630 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
16640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16650 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16660 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16670 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16680 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
16690 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
166a0 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
166b0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
166c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
166d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
166e0 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
166f0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
16700 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
16710 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
16720 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
16730 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
16740 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
16750 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
16760 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
16770 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
16780 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
16790 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
167a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
167b0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
167c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
167d0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
167e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
167f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
16800 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
16810 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
16820 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
16830 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16840 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16850 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
16860 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
16870 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
16880 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
16890 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
168a0 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
168b0 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
168c0 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
168d0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
168e0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
168f0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16900 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
16910 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
16920 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
16930 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
16940 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
16950 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
16960 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
16970 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
16980 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
16990 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
169a0 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
169b0 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
169c0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
169d0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
169e0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
169f0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
16a00 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
16a10 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
16a20 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
16a30 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
16a40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16a50 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
16a60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16a70 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
16a80 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
16a90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
16aa0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
16ab0 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
16ac0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
16ad0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
16ae0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
16af0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
16b00 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16b10 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
16b20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16b30 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16b40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16b50 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
16b60 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
16b70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
16b80 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
16b90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16bb0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16bc0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
16bd0 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
16be0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
16bf0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16c00 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
16c10 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
16c20 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
16c30 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
16c40 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
16c50 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
16c60 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
16c70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
16c80 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
16c90 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
16ca0 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
16cb0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
16cc0 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
16cd0 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
16ce0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
16cf0 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
16d00 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
16d10 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
16d20 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
16d30 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
16d40 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
16d50 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
16d60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16d70 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
16d80 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
16d90 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
16da0 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
16db0 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
16dc0 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
16dd0 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
16de0 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
16df0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
16e00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
16e10 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
16e20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
16e30 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
16e40 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
16e50 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
16e60 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
16e70 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
16e80 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
16e90 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
16ea0 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
16eb0 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
16ec0 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
16ed0 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
16ee0 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
16ef0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
16f00 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
16f10 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
16f20 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
16f30 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
16f40 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
16f50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16f60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16f70 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16f80 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
16f90 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
16fa0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16fb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
16fc0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16fd0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
16fe0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16ff0 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
17000 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
17010 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
17020 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
17030 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
17040 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
17050 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17060 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
17070 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
17080 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
17090 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
170a0 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
170b0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
170c0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
170d0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
170e0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
170f0 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
17100 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
17110 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
17120 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
17130 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
17140 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
17150 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
17160 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
17170 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
17180 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
17190 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
171a0 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
171b0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
171c0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
171d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
171e0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
171f0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17200 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
17210 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
17220 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
17230 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17240 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
17250 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
17260 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17270 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
17280 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17290 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
172a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
172b0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
172c0 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
172d0 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
172e0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
172f0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
17300 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
17310 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
17320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17330 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
17340 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
17350 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
17360 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
17370 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
17380 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
17390 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
173a0 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
173b0 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
173c0 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
173d0 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
173e0 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
173f0 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
17400 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
17410 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
17420 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
17430 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
17440 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
17450 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17460 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
17470 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
17480 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
17490 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
174a0 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
174b0 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
174c0 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
174d0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
174e0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
174f0 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
17500 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
17510 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
17520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17530 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
17540 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
17550 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
17560 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17570 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
17580 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
17590 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
175a0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
175b0 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
175c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
175d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
175e0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
175f0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
17600 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
17610 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
17620 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
17630 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
17640 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
17650 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
17660 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
17670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
17680 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
17690 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
176a0 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
176b0 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
176c0 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
176d0 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
176e0 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
176f0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
17700 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
17710 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17720 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
17730 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
17740 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
17750 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
17760 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
17770 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
17780 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
17790 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
177a0 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
177b0 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
177c0 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
177d0 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
177e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
177f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17800 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
17810 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
17820 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
17830 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
17840 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
17850 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
17860 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
17870 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
17880 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
17890 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
178a0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
178b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
178c0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
178d0 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
178e0 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
178f0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
17900 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
17910 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17920 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
17930 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
17940 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
17950 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
17960 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17970 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
17980 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
17990 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
179a0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
179b0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
179c0 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
179d0 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
179e0 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
179f0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
17a00 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
17a10 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
17a20 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
17a30 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
17a40 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
17a50 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
17a60 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
17a70 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
17a80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
17a90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17aa0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
17ab0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
17ac0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
17ad0 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
17ae0 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
17af0 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
17b00 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
17b10 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
17b20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
17b30 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17b40 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
17b50 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
17b60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17b70 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
17b80 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
17b90 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
17ba0 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
17bb0 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
17bc0 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
17bd0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
17be0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
17bf0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
17c00 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
17c10 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
17c20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
17c30 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
17c40 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
17c50 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
17c60 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
17c70 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
17c80 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
17c90 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
17ca0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17cb0 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
17cc0 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
17cd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17ce0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
17cf0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
17d00 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
17d10 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
17d20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17d30 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
17d40 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
17d50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17d60 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
17d70 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17d80 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
17d90 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
17da0 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
17db0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
17dc0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
17de0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
17df0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
17e00 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
17e10 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
17e20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17e30 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17e40 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
17e50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
17e60 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
17e70 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
17e80 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
17e90 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
17ea0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
17eb0 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
17ec0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17ed0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
17ee0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
17ef0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17f00 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
17f10 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17f20 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
17f30 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
17f40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17f50 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
17f60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
17f70 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
17f80 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
17f90 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
17fa0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
17fb0 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
17fc0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
17fd0 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
17fe0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
18000 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
18010 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
18020 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
18030 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
18040 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
18050 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
18060 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
18070 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
18080 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
18090 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
180a0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
180b0 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
180c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
180d0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
180e0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
180f0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
18100 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
18110 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
18120 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
18130 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
18140 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
18150 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
18160 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
18170 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
18180 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
18190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
181a0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
181b0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
181c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
181d0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
181e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
181f0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
18200 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
18210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
18220 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
18230 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
18240 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
18250 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
18260 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18270 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
18280 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
18290 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
182a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
182b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
182c0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
182d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
182e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
182f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
18300 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
18310 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18320 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
18330 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
18340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
18360 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
18370 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
18380 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
18390 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
183a0 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
183b0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
183c0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
183d0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
183e0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
183f0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
18400 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
18410 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
18420 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
18430 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
18440 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
18450 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
18460 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
18470 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
18480 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
18490 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
184a0 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
184b0 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
184c0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
184d0 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
184e0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
184f0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
18500 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
18510 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
18520 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
18530 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
18540 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
18550 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18560 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45   R-43737-39999 E
18570 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74  very valid SQLit
18580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18590 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69  begins.    ** wi
185a0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
185b0 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65   16 bytes (in he
185c0 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20  x): 53 51 4c 69 
185d0 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37  74 65 20 66 6f 7
185e0 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37  2 6d.    ** 61 7
185f0 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20  4 20 33 00. */. 
18600 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
18610 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
18620 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
18630 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18640 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18650 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18660 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
18670 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
18680 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
18690 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
186a0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
186b0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
186c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
186d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
186e0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
186f0 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
18700 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
18710 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
18720 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
18730 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
18740 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
18750 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18760 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
18770 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
18780 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
18790 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
187a0 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
187b0 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
187c0 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
187d0 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
187e0 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
187f0 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
18800 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
18810 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
18820 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
18830 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
18840 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
18850 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
18860 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
18870 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
18880 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
18890 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
188a0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
188b0 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
188c0 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
188d0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
188e0 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
188f0 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
18900 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
18910 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
18920 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
18930 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
18940 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
18950 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
18960 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
18970 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
18980 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18990 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
189a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
189b0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
189c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
189e0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
189f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
18a00 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18a10 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
18a20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
18a30 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20 20  L_SYNCHRONOUS.  
18a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
18a50 62 3b 0a 20 20 20 20 20 20 20 20 44 62 20 2a 70  b;.        Db *p
18a60 44 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Db;.        if( 
18a70 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
18a80 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
18a90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
18aa0 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
18ab0 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18ac0 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18ad0 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ++; }.          
18ae0 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
18af0 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  t==0.           
18b00 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
18b10 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45 46  evel==SQLITE_DEF
18b20 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
18b30 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  +1.          ){.
18b40 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
18b50 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
18b60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18b70 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  AL_SYNCHRONOUS+1
18b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
18b90 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
18ba0 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18bc0 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18bd0 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18be0 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18bf0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
18c00 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
18c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
18c20 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
18c30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18c40 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
18c50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18c60 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
18c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18c80 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
18c90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18ca0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18cb0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18cc0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
18cd0 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
18ce0 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
18cf0 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
18d00 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
18d10 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
18d20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
18d30 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
18d40 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
18d50 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
18d60 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
18d70 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
18d80 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
18d90 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
18da0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
18db0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
18dc0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
18dd0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
18de0 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
18df0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18e00 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18e10 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18e20 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
18e30 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
18e40 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
18e50 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
18e60 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18e70 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
18e80 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
18e90 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
18ea0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
18eb0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ed0 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
18ee0 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
18ef0 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
18f00 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
18f10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
18f20 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
18f30 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
18f40 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
18f50 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
18f60 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
18f70 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
18f80 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
18f90 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
18fa0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
18fb0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
18fc0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
18fd0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
18fe0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18ff0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19000 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19010 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19020 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19030 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19040 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19050 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19060 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
19070 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
19080 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
19090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
190a0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
190b0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
190c0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
190d0 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
190e0 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
190f0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19100 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19110 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19120 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19130 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19140 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19150 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19160 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
19170 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
19180 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
19190 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
191a0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
191b0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
191c0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
191d0 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
191e0 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
191f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19200 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19210 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19230 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19240 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19250 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19260 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
19270 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
19280 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
19290 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
192a0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
192b0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
192c0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
192d0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
192e0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
192f0 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19300 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19310 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19320 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19330 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19340 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19360 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
19370 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
19380 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
19390 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
193a0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
193b0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
193c0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
193d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
193e0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
193f0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19400 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19430 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19440 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19460 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
19470 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
19480 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
19490 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
194a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
194b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
194c0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
194d0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
194e0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
194f0 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19500 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19510 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19520 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19530 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19540 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19550 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19560 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
19570 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
19580 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
19590 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
195a0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
195b0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
195c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
195d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
195e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
195f0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19600 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19610 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19620 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19630 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19640 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19650 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19660 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
19670 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
19680 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
19690 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
196a0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
196b0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
196c0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
196d0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
196e0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
196f0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19700 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19710 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19720 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19730 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19740 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19750 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19760 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19770 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19780 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19790 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
197a0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
197b0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
197c0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
197d0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
197e0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
197f0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19800 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19810 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19820 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19830 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19840 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19850 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19860 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19870 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19880 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19890 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
198a0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
198b0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
198c0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
198d0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
198e0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
198f0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19900 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19910 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19920 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19930 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19940 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19950 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19960 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19970 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19980 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19990 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
199a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
199b0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
199c0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
199d0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
199e0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
199f0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19a00 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19a10 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19a20 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19a30 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19a40 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19a50 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19a60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19a70 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19a80 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19a90 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19aa0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19ab0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19ac0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19ae0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19af0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19b00 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19b10 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19b20 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19b30 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19b40 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19b50 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
19b60 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19b70 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19b80 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19b90 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19ba0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19bb0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19bc0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19bd0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19be0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19bf0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19c00 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19c10 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19c20 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19c30 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19c40 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
19c50 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
19c60 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19c70 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19c80 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19c90 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19ca0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19cb0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19cc0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
19cd0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
19ce0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
19cf0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
19d00 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
19d10 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
19d20 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
19d30 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
19d40 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
19d50 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
19d60 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
19d70 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
19d80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
19d90 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
19da0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
19db0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
19dc0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
19dd0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
19de0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
19df0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
19e00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19e10 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
19e20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
19e30 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
19e40 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
19e50 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
19e60 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
19e70 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
19e80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
19e90 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
19ea0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
19eb0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19ec0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19ed0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
19ee0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
19ef0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
19f00 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
19f10 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
19f20 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
19f30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
19f40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
19f50 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
19f60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
19f70 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19f80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19f90 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19fb0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
19fc0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
19fd0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
19fe0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
19ff0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a000 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a010 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a020 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a030 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a040 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a060 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a070 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a080 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a090 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a0a0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a0b0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a0c0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a0d0 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a0e0 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a0f0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a100 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a110 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a120 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a130 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a140 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a150 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a160 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a180 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a190 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a1a0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a1b0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a1c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a1d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a1e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a1f0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a200 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a220 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a230 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a240 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a250 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a260 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a270 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a280 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a290 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a2a0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a2b0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a2c0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a2d0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a2e0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a2f0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a300 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a310 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a320 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a330 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a340 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a350 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a360 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a370 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a380 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a390 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a3a0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a3b0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a3c0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a3d0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a3e0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a3f0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a400 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a410 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a420 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a430 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a440 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a450 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a460 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a470 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a480 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a490 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a4a0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a4b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a4c0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a4d0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a4e0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a4f0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a500 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a510 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1a520 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1a530 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1a540 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1a550 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a560 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a570 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1a580 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1a590 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1a5a0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1a5b0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1a5c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a5d0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a5e0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1a5f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a600 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1a610 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a620 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1a630 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1a640 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1a650 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1a660 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1a670 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1a680 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1a690 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1a6a0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1a6b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a6c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a6d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a6e0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1a6f0 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1a700 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1a710 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a720 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1a740 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1a750 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1a760 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1a770 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1a780 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1a790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1a7a0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1a7b0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1a7c0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1a7d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1a7e0 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1a7f0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1a800 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1a810 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1a820 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1a830 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1a840 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1a850 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1a860 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1a870 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1a880 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1a890 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1a8a0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1a8b0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1a8c0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1a8d0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1a8e0 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1a8f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1a900 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1a910 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1a920 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1a930 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1a940 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1a950 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1a960 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1a970 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1a980 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1a990 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1a9a0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1a9b0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a9c0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1a9d0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1a9e0 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1a9f0 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1aa00 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1aa10 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1aa20 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1aa30 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1aa40 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1aa50 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1aa60 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1aa70 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1aa80 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1aa90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1aaa0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1aab0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1aac0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1aad0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1aae0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1aaf0 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1ab00 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1ab10 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1ab20 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1ab30 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1ab40 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1ab50 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1ab60 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1ab70 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1ab80 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1ab90 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1aba0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1abb0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1abc0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1abd0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1abe0 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1abf0 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1ac00 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1ac10 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1ac20 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1ac30 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1ac40 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1ac50 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1ac60 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1ac70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1ac80 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1ac90 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1aca0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1acb0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1acc0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1acd0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1ace0 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1acf0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1ad00 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1ad10 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1ad20 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1ad30 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1ad40 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1ad50 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1ad60 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1ad70 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1ad80 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1ad90 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1ada0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1adb0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1adc0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1add0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1ade0 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1adf0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1ae00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ae10 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1ae20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ae30 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1ae40 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1ae50 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1ae60 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1ae70 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1ae80 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1ae90 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1aea0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1aeb0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1aec0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1aed0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1aee0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1aef0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1af00 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1af10 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1af20 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1af30 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1af40 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1af50 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1af60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1af70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1af80 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1af90 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1afa0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1afb0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1afc0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1afd0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1afe0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1aff0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1b000 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b010 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1b020 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1b030 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1b040 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1b050 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b060 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1b070 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b080 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1b090 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b0a0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1b0b0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1b0c0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1b0d0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1b0e0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1b0f0 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b100 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b110 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b120 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b130 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1b140 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1b150 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1b160 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1b170 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b180 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b190 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1b1a0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b1b0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1b1c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1b1d0 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1b1e0 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1b1f0 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1b200 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1b210 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1b220 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1b230 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1b240 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1b250 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1b260 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b270 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1b280 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b290 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1b2a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b2c0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1b2e0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1b2f0 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1b300 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b310 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b320 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1b330 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1b340 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b350 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1b360 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1b370 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1b380 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1b390 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1b3a0 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1b3b0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1b3c0 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1b3d0 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1b3e0 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1b3f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b400 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1b410 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1b420 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1b430 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1b440 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1b450 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1b460 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1b470 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1b480 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1b490 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1b4a0 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1b4b0 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1b4c0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1b4d0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1b4e0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1b4f0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1b500 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1b510 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1b520 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1b530 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1b540 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1b550 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1b560 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1b570 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1b580 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1b590 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1b5a0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1b5b0 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1b5c0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1b5d0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1b5e0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1b5f0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1b600 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1b610 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1b620 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1b630 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1b640 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1b650 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1b660 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1b670 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1b680 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1b690 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1b6a0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1b6b0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1b6c0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1b6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1b6e0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1b6f0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1b700 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1b710 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1b720 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1b730 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1b740 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1b750 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1b760 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1b770 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1b780 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1b790 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1b7a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b7b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b7c0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1b7d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b7e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1b7f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1b810 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b820 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1b830 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1b840 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1b850 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b860 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1b870 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1b880 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1b890 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1b8a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b8b0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1b8c0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1b8d0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1b8e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1b8f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b900 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1b910 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1b920 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1b930 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1b940 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1b950 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1b960 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1b970 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1b980 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1b990 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1b9a0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1b9b0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1b9c0 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1b9d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1b9e0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1b9f0 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1ba00 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1ba10 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1ba20 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1ba30 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1ba40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ba50 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1ba60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1ba70 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1ba80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1ba90 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1baa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bab0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bac0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1bad0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1bae0 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1baf0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1bb00 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1bb10 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1bb20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1bb30 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1bb40 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1bb50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1bb60 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1bb70 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1bb80 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1bb90 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1bba0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1bbb0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1bbc0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1bbd0 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1bbe0 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1bbf0 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1bc00 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1bc10 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1bc20 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1bc30 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1bc40 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1bc50 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1bc60 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1bc70 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1bc80 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1bc90 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1bca0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1bcb0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1bcc0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1bcd0 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1bce0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1bcf0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1bd00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1bd10 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1bd20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1bd30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bd40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1bd50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1bd60 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1bd70 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1bd80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bd90 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1bda0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1bdb0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1bdc0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1bdd0 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1bde0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1bdf0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1be00 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1be10 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1be20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1be30 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1be40 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1be50 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1be60 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1be70 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1be80 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1be90 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1bea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1beb0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1bec0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1bed0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1bee0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1bef0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1bf00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1bf10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1bf20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1bf30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1bf40 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1bf50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1bf60 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1bf70 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1bf80 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1bf90 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1bfa0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1bfb0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1bfc0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1bfd0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1bfe0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1bff0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1c000 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1c010 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1c020 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1c030 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c050 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1c060 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1c070 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c0a0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1c0b0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1c0c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c0f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c100 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c110 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1c120 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1c130 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c140 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1c150 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1c160 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1c170 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1c180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1c190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1c1a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1c1b0 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1c1c0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1c1d0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1c1e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1c1f0 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1c200 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1c210 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1c220 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c230 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1c240 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1c250 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1c260 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1c270 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1c280 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1c290 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1c2a0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1c2b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1c2c0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1c2d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c2e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c2f0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1c300 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1c310 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1c320 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1c330 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c340 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1c350 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1c360 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1c370 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1c380 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1c390 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1c3a0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1c3b0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1c3c0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1c3d0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1c3e0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1c3f0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1c400 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1c410 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1c420 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1c430 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1c440 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c460 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1c470 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1c480 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1c490 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1c4a0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1c4b0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1c4c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c4d0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1c4e0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1c4f0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1c500 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1c510 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1c520 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1c530 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1c540 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1c550 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1c560 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1c570 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1c580 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1c590 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1c5a0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1c5b0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1c5c0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1c5d0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1c5e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c5f0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1c600 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c610 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1c620 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1c630 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1c640 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c650 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1c660 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1c670 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1c680 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1c690 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1c6a0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1c6b0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1c6c0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1c6d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c6e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c6f0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1c700 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1c710 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1c720 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1c730 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1c740 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1c750 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1c760 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1c770 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1c780 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1c790 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1c7a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1c7b0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1c7c0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1c7d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1c7e0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1c7f0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1c800 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1c810 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1c820 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1c830 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1c840 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1c850 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1c860 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1c870 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1c880 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1c890 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1c8a0 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1c8b0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1c8c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c8d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c8e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1c8f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1c900 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1c910 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1c920 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1c930 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1c940 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1c950 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1c960 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1c980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c990 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1c9a0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1c9b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1c9c0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1c9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c9e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c9f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1ca00 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1ca10 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1ca20 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1ca30 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1ca40 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1ca50 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1ca60 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1ca70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1ca80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ca90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
1caa0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1cab0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1cac0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1cad0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1cae0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1caf0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1cb00 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1cb10 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1cb20 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1cb30 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1cb40 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1cb50 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1cb60 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1cb70 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1cb80 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1cb90 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1cba0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1cbb0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1cbc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1cbd0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1cbe0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1cbf0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1cc00 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1cc10 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1cc20 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1cc30 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1cc40 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1cc50 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1cc60 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1cc70 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1cc80 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1cc90 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1cca0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1ccb0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1ccc0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1ccd0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1cce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1ccf0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1cd00 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1cd10 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1cd20 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1cd30 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1cd40 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1cd50 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1cd60 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1cd70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cd80 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1cd90 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1cda0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1cdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1cdc0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1cdd0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1cde0 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1cdf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1ce00 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1ce10 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1ce20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1ce30 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1ce40 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1ce50 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1ce60 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1ce70 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1ce80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1ce90 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1cea0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1ceb0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1cec0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1ced0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1cee0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1cef0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1cf00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1cf10 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1cf20 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1cf30 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1cf40 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1cf50 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1cf60 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1cf70 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1cf80 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1cf90 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1cfa0 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1cfb0 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1cfc0 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1cfd0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1cfe0 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1cff0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1d000 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1d010 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1d020 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1d030 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1d040 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1d050 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1d060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d080 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1d090 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1d0a0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1d0b0 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1d0c0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1d0d0 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1d0e0 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1d0f0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1d100 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1d110 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1d120 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1d130 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1d140 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1d150 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1d160 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1d170 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1d180 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1d190 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1d1a0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1d1b0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1d1c0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1d1d0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1d1e0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1d1f0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1d200 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1d210 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1d220 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1d230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d240 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1d250 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d260 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1d270 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1d280 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1d290 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d2a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d2b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d2c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1d2d0 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1d2e0 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1d2f0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1d300 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1d310 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d320 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1d330 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1d340 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1d350 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d370 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d390 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1d3a0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1d3b0 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1d3c0 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1d3d0 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1d3e0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1d3f0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1d400 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1d410 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1d420 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1d430 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1d440 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1d450 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1d460 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d470 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1d480 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1d490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d4a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d4b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1d4c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d4d0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1d4e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1d4f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d500 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1d510 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1d520 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d530 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1d540 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1d550 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1d560 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1d570 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1d580 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1d590 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d5b0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1d5c0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1d5d0 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1d5e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d5f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1d600 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1d610 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1d620 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1d630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1d640 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d650 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1d660 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1d670 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1d680 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1d690 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1d6a0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1d6b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1d6c0 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1d6d0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1d6e0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1d6f0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1d700 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1d710 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1d720 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1d730 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1d740 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1d750 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1d760 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1d770 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1d780 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1d790 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1d7a0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1d7b0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1d7c0 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1d7d0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1d7e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1d7f0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1d800 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1d810 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1d820 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1d830 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1d840 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1d850 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1d860 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1d870 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1d880 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1d890 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1d8a0 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1d8b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1d8c0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1d8d0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1d8e0 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1d8f0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1d900 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1d910 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1d920 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1d930 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1d940 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1d950 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1d960 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1d970 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1d980 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1d990 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1d9a0 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1d9b0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1d9c0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1d9d0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1d9e0 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1d9f0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1da00 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1da10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1da20 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1da30 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1da40 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1da50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1da60 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1da70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1da80 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1da90 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1daa0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1dab0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1dac0 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1dad0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1dae0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1daf0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1db00 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1db10 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1db20 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1db30 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1db40 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1db50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1db60 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1db70 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1db80 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1db90 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1dba0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1dbb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dbc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1dbd0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1dbe0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1dbf0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1dc00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1dc10 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1dc20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1dc30 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1dc40 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1dc50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1dc60 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1dc70 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1dc80 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1dc90 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1dca0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1dcb0 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1dcc0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1dcd0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1dce0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1dcf0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1dd00 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1dd10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1dd20 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1dd30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1dd40 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1dd50 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1dd60 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1dd70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dd80 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1dd90 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1dda0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1ddb0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1ddc0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1ddd0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1dde0 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1ddf0 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1de00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1de10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1de20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1de30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1de40 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1de50 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1de60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1de70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1de80 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1de90 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1dea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1deb0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1dec0 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1ded0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1dee0 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1def0 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1df00 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1df10 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1df20 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1df30 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1df40 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1df50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1df60 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1df70 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1df80 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1df90 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1dfa0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1dfb0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1dfc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1dfd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dfe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1dff0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e000 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1e010 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1e020 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1e030 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1e040 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1e050 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1e060 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1e070 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1e080 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1e090 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1e0a0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1e0b0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1e0c0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1e0d0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1e0e0 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1e0f0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1e100 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1e110 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1e120 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1e130 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1e140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e150 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1e160 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1e170 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1e180 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1e190 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1e1a0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1e1b0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1e1c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1e1d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e1e0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1e1f0 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1e200 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1e210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e220 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1e230 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1e240 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1e250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e260 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1e270 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1e280 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1e290 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1e2a0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1e2b0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e2c0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1e2d0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1e2e0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1e2f0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1e300 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1e310 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1e320 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e330 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1e340 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e350 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e360 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e370 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1e380 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e390 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1e3a0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1e3b0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1e3c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e3d0 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1e3e0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1e3f0 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1e400 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1e410 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1e420 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1e430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1e450 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1e460 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1e470 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1e480 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1e490 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1e4a0 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1e4b0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1e4c0 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1e4d0 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1e4e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e4f0 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1e500 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1e510 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1e520 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1e530 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1e540 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1e550 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1e560 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e590 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1e5a0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1e5b0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1e5e0 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1e5f0 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1e600 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1e610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e620 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1e630 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1e640 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1e650 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1e660 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1e670 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1e680 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1e690 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1e6a0 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1e6b0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1e6c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e6d0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1e6e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e6f0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1e700 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1e710 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e720 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1e730 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1e740 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1e750 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1e760 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1e770 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1e780 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1e790 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1e7a0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1e7b0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1e7c0 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1e7d0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1e7e0 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1e7f0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1e800 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1e810 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1e820 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1e830 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1e840 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1e850 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1e860 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1e870 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1e880 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1e890 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e8a0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1e8b0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e8c0 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1e8d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1e8e0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1e8f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1e900 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1e910 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1e920 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1e930 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1e940 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e950 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1e960 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1e970 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1e980 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1e990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e9a0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1e9b0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1e9c0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1e9d0 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1e9e0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1e9f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ea00 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1ea10 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1ea20 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1ea30 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1ea40 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1ea50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ea60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ea70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1ea80 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1ea90 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1eaa0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1eab0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1eac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ead0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1eae0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1eaf0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1eb00 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1eb10 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1eb20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1eb30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1eb40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1eb50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1eb60 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1eb70 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1eb80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1eb90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1eba0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1ebb0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1ebc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ebd0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1ebe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ebf0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ec00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ec10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ec20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1ec30 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1ec40 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1ec50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1ec60 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1ec70 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1ec80 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1ec90 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1eca0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1ecb0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1ecc0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1ecd0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1ece0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1ecf0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1ed00 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1ed10 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1ed20 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1ed30 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1ed40 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1ed50 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1ed60 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1ed70 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1ed80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1ed90 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1eda0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1edb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1edc0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1edd0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1ede0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1edf0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1ee00 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1ee10 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1ee20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ee30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ee40 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1ee50 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ee60 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1ee70 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1ee80 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1ee90 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1eea0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1eeb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1eec0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1eed0 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1eee0 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1eef0 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1ef00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1ef10 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1ef20 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1ef30 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1ef40 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1ef50 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1ef60 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1ef70 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1ef80 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1ef90 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1efa0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1efb0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1efc0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1efd0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1efe0 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1eff0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f000 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1f010 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1f020 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1f030 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1f040 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1f050 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1f060 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1f070 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1f080 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1f090 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1f0a0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1f0b0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1f0c0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1f0d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1f0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f0f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f100 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1f110 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f120 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f130 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1f140 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f150 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1f160 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1f170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f180 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f190 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1f1a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1f1b0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1f1c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1f1d0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1f1e0 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1f1f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1f200 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1f210 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f220 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f230 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1f240 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1f250 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1f260 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1f270 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1f280 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f290 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f2a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f2b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f2c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f2d0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1f2e0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1f2f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f300 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1f310 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f320 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1f330 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1f340 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1f350 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1f360 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1f370 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1f390 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f3a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1f3b0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1f3c0 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1f3d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f3e0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1f3f0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1f400 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1f410 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1f420 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1f430 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1f440 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1f450 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f460 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1f470 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1f480 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1f490 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1f4a0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1f4b0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1f4c0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1f4d0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1f4e0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1f4f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1f500 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1f510 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1f520 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1f530 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1f540 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1f550 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1f560 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1f570 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1f580 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1f590 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1f5a0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1f5b0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1f5c0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1f5d0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1f5e0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1f5f0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1f600 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1f610 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1f620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f630 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1f640 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1f650 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1f660 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1f670 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1f680 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1f690 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1f6a0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1f6b0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1f6c0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1f6d0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1f6e0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1f6f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f700 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1f710 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1f720 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1f730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1f740 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1f750 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1f760 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1f770 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1f780 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1f790 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1f7a0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1f7b0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1f7c0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1f7d0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1f7e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f7f0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1f800 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1f810 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1f820 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1f830 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1f840 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1f850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1f860 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1f870 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1f880 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1f890 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1f8a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1f8b0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1f8c0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
1f8d0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
1f8e0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
1f8f0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
1f900 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1f910 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
1f920 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
1f930 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
1f940 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
1f950 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
1f960 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
1f970 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
1f980 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
1f990 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1f9a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f9b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1f9c0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
1f9d0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1f9e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f9f0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
1fa00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1fa10 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1fa20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fa30 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1fa40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
1fa50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fa60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1fa70 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fa80 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
1fa90 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
1faa0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
1fab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
1fad0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1fae0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1faf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fb00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1fb10 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
1fb20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fb30 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1fb40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
1fb50 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
1fb60 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1fb70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1fb80 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
1fb90 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
1fba0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1fbb0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fbc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fbd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1fbe0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1fbf0 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
1fc00 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1fc10 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
1fc20 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
1fc30 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
1fc40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
1fc50 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
1fc60 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
1fc70 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
1fc80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fc90 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
1fca0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
1fcb0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1fcc0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1fcd0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fce0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fcf0 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
1fd00 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
1fd10 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1fd20 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1fd30 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
1fd40 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1fd50 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
1fd60 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
1fd70 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
1fd80 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
1fd90 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
1fda0 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
1fdb0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
1fdc0 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
1fdd0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
1fde0 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
1fdf0 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1fe00 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
1fe10 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
1fe20 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1fe30 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
1fe40 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
1fe50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fe60 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1fe70 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
1fe80 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1fe90 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
1fea0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1feb0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
1fec0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
1fed0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1fee0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
1fef0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
1ff00 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1ff10 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
1ff20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1ff30 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
1ff40 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
1ff50 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
1ff60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
1ff70 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
1ff80 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
1ff90 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
1ffa0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1ffb0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1ffc0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
1ffd0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
1ffe0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1fff0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
20000 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
20010 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
20020 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
20030 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
20040 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
20050 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
20060 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
20070 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
20080 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
20090 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
200a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
200b0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
200c0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
200d0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
200e0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
200f0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
20100 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
20110 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
20120 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
20130 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
20140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20150 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
20160 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
20170 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
20180 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
20190 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
201a0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
201b0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
201c0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
201d0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
201e0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
201f0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
20200 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
20210 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
20220 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
20230 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
20240 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
20250 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
20260 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
20270 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
20280 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
20290 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
202a0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
202b0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
202c0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
202d0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
202e0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
202f0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
20300 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20310 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
20320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20330 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
20340 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
20350 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
20360 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20370 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
20380 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
20390 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
203a0 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
203b0 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
203c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
203d0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
203e0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
203f0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
20400 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
20410 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
20420 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20430 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
20440 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
20450 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20460 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
20470 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
20480 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
20490 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
204a0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
204b0 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
204c0 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
204d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
204e0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
204f0 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
20500 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
20510 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
20520 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
20530 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
20540 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
20550 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
20560 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
20570 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
20580 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
20590 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
205a0 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
205b0 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
205c0 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
205d0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
205e0 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
205f0 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
20600 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
20610 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
20620 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
20630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20640 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
20650 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
20660 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
20670 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
20680 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
20690 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
206a0 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
206b0 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
206c0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
206d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
206e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
206f0 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
20700 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
20710 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20720 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
20730 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
20740 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
20750 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
20760 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
20770 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
20780 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
20790 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
207a0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
207b0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
207c0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
207d0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
207e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
207f0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
20800 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
20810 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
20820 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20830 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
20840 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
20850 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20860 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
20870 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
20890 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
208a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
208b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
208c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
208d0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
208e0 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
208f0 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
20900 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
20910 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
20920 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
20930 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
20940 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
20950 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
20960 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
20970 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
20980 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20990 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
209a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
209b0 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
209c0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
209d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
209e0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
209f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
20a00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20a10 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
20a20 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20a30 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
20a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20a50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20a60 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20a70 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
20a80 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
20a90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20aa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
20ac0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
20ad0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
20ae0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
20af0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
20b00 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
20b10 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
20b20 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
20b30 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
20b40 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
20b50 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
20b60 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
20b70 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
20b80 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
20b90 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
20ba0 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
20bb0 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
20bc0 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
20bd0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
20be0 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
20bf0 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
20c00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20c10 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
20c20 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
20c30 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
20c40 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
20c50 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
20c60 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
20c70 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
20c80 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
20c90 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
20ca0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
20cb0 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
20cc0 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
20cd0 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
20ce0 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
20cf0 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
20d00 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
20d10 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
20d20 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
20d30 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
20d40 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
20d50 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
20d60 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
20d70 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
20d80 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
20d90 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
20da0 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
20db0 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
20dc0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
20dd0 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
20de0 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
20df0 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
20e00 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
20e10 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
20e20 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
20e30 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
20e40 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
20e50 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
20e60 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20e70 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
20e80 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
20e90 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
20ea0 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
20eb0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
20ec0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
20ed0 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
20ee0 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
20ef0 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
20f00 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
20f10 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
20f20 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
20f30 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
20f40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20f50 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
20f60 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
20f70 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
20f80 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
20f90 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20fa0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
20fb0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
20fc0 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
20fd0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
20fe0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
20ff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21000 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
21010 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
21020 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
21030 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
21040 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
21050 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21060 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
21070 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
21080 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
21090 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
210a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
210b0 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
210c0 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
210d0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
210e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
210f0 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
21100 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
21110 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
21120 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
21130 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
21140 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
21150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21170 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
21180 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
21190 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
211a0 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
211b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
211c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
211d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
211e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
211f0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
21200 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
21210 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
21220 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
21230 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
21240 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
21250 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21260 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
21270 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
21280 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
21290 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  i]);.        p->
212a0 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
212b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
212c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
212d0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
212e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
212f0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
21300 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
21310 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21320 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
21330 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
21340 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
21350 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
21360 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
21370 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
21380 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
21390 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
213a0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
213b0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
213c0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
213d0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
213e0 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
213f0 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
21400 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
21410 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
21420 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
21430 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
21440 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21450 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
21460 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21470 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
21480 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
21490 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
214a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
214b0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
214c0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
214d0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
214e0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
214f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21500 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21510 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
21520 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
21530 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
21540 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
21550 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
21560 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
21570 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
21580 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
21590 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
215a0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
215b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
215c0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
215d0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
215e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
215f0 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
21600 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21610 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21620 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
21630 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
21640 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
21650 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21660 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
21670 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
21680 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21690 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
216a0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
216b0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
216c0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
216d0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
216e0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
216f0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
21700 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21710 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21720 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
21730 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
21740 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21750 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
21760 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21770 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
21780 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
21790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
217a0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
217b0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
217c0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
217d0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
217e0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
217f0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
21800 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
21810 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
21820 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
21830 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
21840 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
21850 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
21860 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21870 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
21880 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
21890 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
218a0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
218b0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
218c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
218d0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
218e0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
218f0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
21900 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
21910 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21920 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21930 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
21940 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
21950 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
21960 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21970 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
21980 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
21990 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
219a0 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
219b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
219c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
219d0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
219e0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
219f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
21a00 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21a20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
21a40 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
21a50 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21a60 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21a70 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
21a80 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
21a90 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
21aa0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
21ab0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
21ac0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21ad0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
21ae0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
21af0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
21b00 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
21b10 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
21b20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
21b30 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
21b40 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
21b50 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
21b60 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
21b70 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
21b80 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
21b90 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
21ba0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
21bb0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
21bc0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
21bd0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
21be0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
21bf0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
21c00 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
21c10 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
21c20 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
21c30 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
21c40 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
21c50 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
21c60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21c70 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
21c80 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
21c90 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21ca0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
21cb0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
21cc0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
21cd0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
21ce0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
21cf0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
21d00 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
21d10 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
21d20 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
21d30 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
21d40 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
21d50 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21d60 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
21d70 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
21d80 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
21d90 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
21da0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
21db0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
21dc0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
21dd0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
21de0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
21df0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
21e00 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
21e10 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
21e20 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
21e30 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
21e40 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
21e50 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21e60 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21e70 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
21e80 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
21e90 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
21ea0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
21eb0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
21ec0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
21ed0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
21ee0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
21ef0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
21f00 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
21f10 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
21f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
21f30 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21f40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
21f50 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
21f60 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
21f70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21f80 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
21f90 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
21fa0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
21fb0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
21fc0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
21fd0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
21fe0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
21ff0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
22000 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
22010 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
22020 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
22030 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
22040 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22050 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
22060 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
22070 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
22080 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
22090 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
220a0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
220b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
220c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
220d0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
220e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
220f0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
22100 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
22110 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
22120 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
22130 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
22140 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
22150 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
22160 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
22170 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
22180 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
22190 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
221a0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
221b0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
221c0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
221d0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
221e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
221f0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
22200 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
22210 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
22220 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
22230 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
22240 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22250 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
22260 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
22270 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
22280 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
22290 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
222a0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
222b0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
222c0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
222d0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
222e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
222f0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
22300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22310 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
22320 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
22330 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
22340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22350 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
22360 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22370 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
22380 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22390 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
223a0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
223b0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
223c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
223d0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
223e0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
223f0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
22400 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
22410 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
22420 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22430 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
22440 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22450 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
22460 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
22470 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
22480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
224a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
224b0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
224c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
224d0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
224e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
224f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22500 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
22510 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
22520 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
22530 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
22540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
22550 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
22560 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
22570 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
22580 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
22590 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
225a0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
225b0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
225c0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
225d0 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
225e0 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
225f0 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
22600 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
22610 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22620 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
22630 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
22640 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
22650 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
22660 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
22670 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
22680 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
22690 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
226a0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
226b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
226c0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
226d0 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
226e0 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
226f0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
22700 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
22710 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
22720 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
22730 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22740 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
22750 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
22760 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
22770 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
22780 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22790 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
227a0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
227b0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
227c0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
227d0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
227e0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
227f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22800 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
22810 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
22820 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
22830 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
22840 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
22850 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
22860 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
22870 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
22880 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
22890 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
228a0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
228b0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
228c0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
228d0 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
228e0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
228f0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
22900 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
22910 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
22920 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
22930 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
22940 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
22950 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
22960 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
22970 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
22980 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
22990 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
229a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
229b0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
229c0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
229d0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
229e0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
229f0 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
22a00 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
22a10 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
22a20 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
22a30 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
22a40 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
22a50 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
22a60 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
22a70 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
22a80 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
22a90 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
22aa0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
22ab0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
22ac0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
22ad0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
22ae0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
22af0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
22b00 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
22b10 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
22b20 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
22b30 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
22b40 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
22b50 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
22b60 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
22b70 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
22b80 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
22b90 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
22ba0 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
22bb0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
22bc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
22bd0 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
22be0 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
22bf0 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
22c00 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
22c10 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
22c20 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
22c30 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
22c40 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
22c50 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
22c60 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
22c70 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
22c80 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
22c90 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
22ca0 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
22cb0 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
22cc0 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
22cd0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
22ce0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
22cf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
22d00 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
22d10 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
22d20 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
22d30 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
22d40 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
22d50 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
22d60 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
22d70 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
22d80 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
22d90 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
22da0 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
22db0 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
22dc0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
22dd0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
22de0 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
22df0 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
22e00 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
22e10 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
22e20 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
22e30 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
22e40 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
22e50 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
22e60 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
22e70 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
22e80 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
22e90 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
22ea0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
22eb0 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
22ec0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
22ed0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
22ee0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
22ef0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
22f00 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
22f10 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22f40 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
22f50 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
22f80 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
22f90 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
22fc0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
22fd0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
22fe0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
22ff0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
23000 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23010 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
23020 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
23030 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23060 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
23070 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23080 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
23090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
230a0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
230b0 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
230c0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
230e0 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
230f0 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
23100 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23110 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23120 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
23130 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
23140 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23150 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
23160 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
23170 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
23180 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
23190 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
231a0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
231b0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
231c0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
231d0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
231e0 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
231f0 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
23200 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
23210 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
23220 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
23230 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
23240 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
23250 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
23260 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
23270 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
23280 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
23290 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
232a0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
232b0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
232c0 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
232d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
232e0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
232f0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
23300 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
23310 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23320 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
23330 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
23340 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
23350 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
23360 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
23370 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
23380 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
23390 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
233a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
233b0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
233c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
233d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
233e0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
233f0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23400 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23410 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
23420 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
23430 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
23440 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
23450 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
23460 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
23470 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
23480 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
23490 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
234a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
234b0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
234c0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
234d0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
234e0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
234f0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
23500 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
23510 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
23520 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
23530 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
23540 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
23550 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
23560 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
23570 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
23580 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
23590 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
235a0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
235b0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
235c0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
235d0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
235e0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
235f0 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
23600 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
23610 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
23620 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
23630 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
23640 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
23650 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
23660 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
23670 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
23680 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
23690 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
236a0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
236b0 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
236c0 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
236d0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
236e0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
236f0 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
23700 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
23710 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
23720 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
23730 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23740 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
23750 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
23760 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
23770 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
23780 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
23790 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
237a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
237b0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
237c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
237d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
237e0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23810 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23820 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23860 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23870 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238a0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
238b0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
238c0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
238d0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
238e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
238f0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
23900 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
23910 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23940 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
23950 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23960 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
23970 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23980 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
239a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
239b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
239c0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
239d0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
239e0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
239f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23a00 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23a20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
23a30 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
23a40 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
23a50 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
23a60 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
23a70 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
23a80 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
23a90 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
23aa0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
23ab0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
23ac0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
23ad0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
23ae0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
23af0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
23b00 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
23b10 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
23b20 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
23b30 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
23b40 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23b50 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
23b60 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
23b70 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
23b80 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
23b90 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
23ba0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
23bb0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
23bc0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
23bd0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
23be0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
23bf0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
23c00 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
23c10 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
23c20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
23c30 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
23c40 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
23c50 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
23c60 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
23c70 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
23c80 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
23c90 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
23ca0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
23cb0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
23cc0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
23cd0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
23ce0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23cf0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
23d00 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
23d10 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
23d20 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
23d30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
23d40 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
23d50 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
23d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23d70 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
23d80 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
23d90 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
23da0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23db0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
23dc0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
23dd0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
23de0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
23df0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
23e00 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
23e10 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
23e20 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
23e30 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
23e40 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
23e50 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
23e60 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
23e70 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
23e80 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
23e90 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
23ea0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
23eb0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
23ec0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
23ed0 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
23ee0 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
23ef0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
23f00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
23f10 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
23f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
23f30 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
23f40 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
23f50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
23f70 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
23f80 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
23f90 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
23fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
23fb0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
23fc0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
23fd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
23fe0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
23ff0 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
24000 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
24010 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24020 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
24030 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
24040 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
24050 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
24060 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
24070 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
24090 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
240a0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
240b0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
240c0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
240d0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
240e0 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
240f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
24100 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
24110 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
24120 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
24130 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
24140 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
24150 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
24160 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
24170 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
24180 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
24190 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
241a0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
241b0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
241c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
241d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
241e0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
241f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
24200 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
24210 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
24220 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
24230 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
24240 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
24250 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
24260 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
24270 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
24280 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
24290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
242a0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
242b0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
242c0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
242d0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
242e0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
242f0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
24300 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
24310 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
24320 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
24330 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24340 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  {.  if( pCur->in
24350 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
24360 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
24370 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
24380 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
24390 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
243a0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
243b0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
243c0 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
243d0 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
243e0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
243f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
24400 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
24410 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
24420 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
24430 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
24440 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
24450 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
24460 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
24470 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
24480 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
24490 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
244a0 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
244b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
244c0 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
244d0 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
244e0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
244f0 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
24500 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
24510 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
24520 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
24530 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
24540 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
24550 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
24560 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
24570 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
24580 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24590 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
245a0 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  EBUG */.int sqli
245b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
245c0 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72  ValidNN(BtCursor
245d0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
245e0 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
245f0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
24600 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24610 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
24620 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
24630 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
24640 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61  or "rowid" for a
24650 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a   table btree..**
24660 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24670 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
24680 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
24690 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61   pointing into a
246a0 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62  .** ordinary tab
246b0 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  le btree.  If th
246c0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
246d0 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  to an index btre
246e0 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c  e or.** is inval
246f0 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f  id, the result o
24700 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
24710 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
24720 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
24730 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72  IntegerKey(BtCur
24740 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
24750 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24760 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24770 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24780 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24790 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
247a0 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
247b0 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  y );.  getCellIn
247c0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
247d0 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  rn pCur->info.nK
247e0 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ey;.}../*.** Ret
247f0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
24800 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  f bytes of paylo
24810 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ad for the entry
24820 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
24830 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24840 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62  ing to.  For tab
24850 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20  le btrees, this 
24860 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75  will be the amou
24870 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20  nt.** of data.  
24880 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73  For index btrees
24890 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
248a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b  he size of the k
248b0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
248c0 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
248d0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
248e0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
248f0 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
24900 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
24910 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
24920 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
24930 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
24940 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
24950 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
24960 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
24970 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73  _VALID..*/.u32 s
24980 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
24990 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  adSize(BtCursor 
249a0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
249b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
249c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
249d0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
249e0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
249f0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
24a00 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
24a10 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  n pCur->info.nPa
24a20 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  yload;.}../*.** 
24a30 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
24a40 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
24a50 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
24a60 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
24a70 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
24a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
24a90 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
24aa0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
24ab0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
24ac0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
24ad0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
24ae0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
24af0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
24b00 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
24b10 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
24b20 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
24b30 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
24b40 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
24b50 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
24b60 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
24b70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
24b80 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
24b90 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
24ba0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
24bb0 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
24bc0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
24bd0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
24be0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
24bf0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
24c00 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
24c10 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
24c20 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
24c30 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
24c40 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
24c50 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
24c60 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
24c70 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
24c80 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
24c90 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
24ca0 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
24cb0 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
24cc0 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
24cd0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24ce0 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
24cf0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
24d00 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
24d10 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
24d20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
24d30 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
24d40 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
24d50 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
24d60 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
24d70 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
24d80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
24d90 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
24da0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
24db0 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
24dc0 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
24dd0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
24de0 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
24df0 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
24e00 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
24e10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
24e20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24e30 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e50 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
24e60 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
24e70 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
24e80 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
24e90 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
24ea0 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
24eb0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
24ec0 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
24ed0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
24ee0 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
24ef0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
24f00 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
24f10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24f20 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
24f30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24f40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24f50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
24f60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
24f70 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
24f80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24f90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24fa0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
24fb0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
24fc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
24fd0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
24fe0 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
24ff0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
25000 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
25010 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
25020 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
25030 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
25040 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
25050 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
25060 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
25070 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
25080 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
25090 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
250a0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
250b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
250c0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
250d0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
250e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
250f0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
25100 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
25110 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
25120 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
25130 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
25140 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
25150 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
25160 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
25170 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
25180 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
25190 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
251a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
251b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
251c0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
251d0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
251e0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
251f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
25200 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
25210 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
25220 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
25230 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
25240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25250 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
25260 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25270 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
25280 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
25290 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
252a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
252b0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
252c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
252d0 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
252e0 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
252f0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
25300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
25310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
25320 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
25330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25340 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
25350 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
25360 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
25370 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
25380 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
25390 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
253a0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
253b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
253c0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
253d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
253e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
253f0 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
25400 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
25410 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
25420 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
25430 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
25440 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
25450 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
25460 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
25470 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
25480 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
25490 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
254a0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
254b0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
254c0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
254d0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
254e0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
254f0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
25500 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
25510 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
25520 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
25530 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
25540 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
25550 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
25560 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
25570 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
25580 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
25590 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
255a0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
255b0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
255c0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
255d0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
255e0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
255f0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
25600 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
25610 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
25620 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
25630 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
25640 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
25650 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25670 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
25680 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
25690 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
256a0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
256b0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
256c0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
256d0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
256e0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
256f0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
25700 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
25710 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
25720 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
25730 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
25740 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
25750 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
25760 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
25770 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
25780 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
25790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
257a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
257b0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
257c0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
257d0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
257e0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
257f0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
25800 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
25810 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
25820 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
25830 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
25840 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
25850 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
25860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25870 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
25880 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
25890 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
258a0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
258b0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
258c0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
258d0 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61  to. The eOp.** a
258e0 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72  rgument is inter
258f0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
25900 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68  s:.**.**   0: Th
25910 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25920 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20   read. Populate 
25930 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
25940 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20  he..**   1: The 
25950 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77  operation is a w
25960 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  rite. Populate t
25970 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
25980 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
25990 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
259a0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
259b0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
259c0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
259d0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
259e0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
259f0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
25a00 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
25a10 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
25a20 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
25a30 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
25a40 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
25a50 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
25a60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
25a70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25a80 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
25a90 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
25aa0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
25ab0 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  s.** this functi
25ac0 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
25ad0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
25ae0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a  zily populate.**
25af0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25b00 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
25b10 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
25b20 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
25b30 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
25b40 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
25b50 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
25b60 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
25b70 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
25b80 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
25b90 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
25ba0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
25bb0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
25bc0 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a  ed, it must be.*
25bd0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
25be0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
25bf0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
25c00 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
25c10 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
25c20 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
25c30 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
25c40 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
25c50 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
25c60 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
25c70 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
25c80 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
25c90 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
25ca0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
25cb0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
25cc0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
25cd0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
25ce0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
25cf0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
25d00 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
25d10 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
25d20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
25d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
25d40 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
25d50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25d60 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
25d70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
25d80 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
25d90 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
25da0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
25db0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
25dc0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
25dd0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
25de0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
25df0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
25e00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
25e10 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
25e20 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
25e30 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
25e40 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
25e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
25e60 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
25e70 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
25e80 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
25e90 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
25ea0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25eb0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
25ec0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
25ed0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25ee0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25ef0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
25f00 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
25f10 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
25f20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f40 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
25f50 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
25f60 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
25f70 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25f80 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
25f90 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
25fa0 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
25fb0 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  f;     /* Start 
25fc0 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20  of original out 
25fd0 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66  buffer */.#endif
25fe0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25ff0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
26000 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20  Op==0 || eOp==1 
26010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26020 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26030 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
26040 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26050 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
26060 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
26070 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26080 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26090 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
260a0 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
260b0 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
260c0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65  pPayload;.  asse
260d0 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
260e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
260f0 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65  yload );..  asse
26100 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70  rt( aPayload > p
26110 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
26120 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61 79   if( (uptr)(aPay
26130 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44  load - pPage->aD
26140 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61  ata) > (pBt->usa
26150 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e  bleSize - pCur->
26160 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a  info.nLocal) ){.
26170 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
26180 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
26190 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
261a0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
261b0 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  ror.  The.    **
261c0 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
261d0 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20  ve is really:.  
261e0 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61    **    &aPayloa
261f0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
26200 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
26210 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
26220 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74  Size].    ** but
26230 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20   is recast into 
26240 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d  its current form
26250 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65   to avoid intege
26260 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c  r overflow probl
26270 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ems.    */.    r
26280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26290 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
262a0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
262b0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
262c0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
262d0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
262e0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
262f0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
26300 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
26310 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
26320 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
26330 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
26340 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
26350 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
26360 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
26370 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
26380 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
26390 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
263a0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
263b0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
263c0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
263d0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
263e0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
263f0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
26400 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
26410 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
26420 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
26430 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
26440 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
26450 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
26460 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
26470 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
26480 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
26490 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
264a0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
264b0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
264c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
264d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
264e0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
264f0 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
26500 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
26510 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
26520 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
26530 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
26540 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
26550 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
26560 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
26570 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
26580 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
26590 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
265a0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
265b0 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
265c0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
265d0 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
265e0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
265f0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
26600 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
26610 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
26620 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
26630 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
26640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26650 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26660 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
26670 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
26680 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
26690 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
266a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
266b0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
266c0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
266d0 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
266e0 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
266f0 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
26700 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
26710 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
26720 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
26730 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
26740 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
26750 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
26760 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
26770 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26780 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
26790 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
267a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
267b0 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
267c0 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
267d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
267e0 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
267f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
26800 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
26810 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
26820 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
26830 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
26840 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
26850 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ovfl;.    }else{
26860 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
26870 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26880 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
26890 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
268a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e   the.      ** en
268b0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
268c0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
268d0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
268e0 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a  d, skip.      **
268f0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
26900 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26910 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
26920 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
26930 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ize] ){.        
26940 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
26950 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
26960 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
26970 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26980 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  x];.        offs
26990 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
269a0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lSize);.      }.
269b0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
269c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
269d0 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20   && amt>0 );.   
269e0 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65   while( nextPage
269f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
26a00 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
26a10 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
26a20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
26a30 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26a40 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
26a50 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20  w[iIdx]==0.     
26a60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
26a70 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26a80 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20  ]==nextPage.    
26a90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52            || COR
26aa0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20  RUPT_DB );.     
26ab0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26ac0 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
26ad0 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  e;..      if( of
26ae0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
26af0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
26b00 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
26b10 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
26b20 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
26b30 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
26b40 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
26b50 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
26b60 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
26b70 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
26b80 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
26b90 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
26ba0 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
26bb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
26bc0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
26bd0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
26be0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
26bf0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
26c00 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
26c10 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
26c20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26c30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26c40 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
26c50 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
26c60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26c70 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
26c80 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
26c90 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
26ca0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
26cb0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
26cc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
26cd0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
26ce0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
26d00 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
26d10 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
26d20 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
26d30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
26d40 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
26d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26d60 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
26d70 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
26d80 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
26d90 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
26da0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
26db0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
26dc0 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
26dd0 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
26de0 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
26df0 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
26e00 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
26e10 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
26e20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26e30 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  fd;      /* File
26e40 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
26e50 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f  o direct overflo
26e60 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  w read */.#endif
26e70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
26e80 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
26e90 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
26ea0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
26eb0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
26ec0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
26ed0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
26ee0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
26ef0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
26f00 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
26f10 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
26f20 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
26f30 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
26f40 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
26f50 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
26f60 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
26f70 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
26f80 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
26f90 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
26fa0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
26fb0 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69   **   3) there i
26fc0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
26fd0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
26fe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
26ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27000 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
27010 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
27020 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
27030 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
27040 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
27050 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
27060 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
27070 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
27080 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
27090 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
270a0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
270b0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
270c0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
270d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
270e0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
270f0 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
27100 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
27110 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
27120 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
27130 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
27140 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
27150 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
27160 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
27170 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
27180 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
27190 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271c0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
271d0 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27200 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
27210 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
27220 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
27230 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27250 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
27260 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
27270 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
27280 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
27290 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29  thods     /* (4)
272a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
272b0 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55  0==sqlite3PagerU
272c0 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  seWal(pBt->pPage
272d0 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20  r, nextPage)    
272e0 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
272f0 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
27300 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
27330 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  6) */.        ){
27340 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
27350 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
27360 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
27370 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
27380 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
27390 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20           /* due 
273c0 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  to (6) */.      
273d0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
273e0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
273f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27400 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
27410 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
27420 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
27430 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
27440 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27450 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
27460 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
27470 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
27480 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
27490 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
274a0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
274b0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
274c0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
274d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
274e0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
274f0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
27500 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
27510 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45    (eOp==0 ? PAGE
27520 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
27530 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
27540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27560 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
27570 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
27580 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
27590 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
275a0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
275b0 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
275c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
275d0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
275e0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
275f0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
27600 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27610 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
27620 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
27630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
27640 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
27650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27660 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
27670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d  ;.        if( am
27680 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  t==0 ) return rc
27690 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
276a0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
276b0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
276c0 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b  k;.      iIdx++;
276d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
276e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
276f0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
27700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27710 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a 20 4f  RRUPT_BKPT; /* O
27720 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e  verflow chain en
27730 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a  ds prematurely *
27740 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
27750 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
27760 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
27770 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
27780 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
27790 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
277a0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
277b0 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
277c0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
277d0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
277e0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
277f0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
27800 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
27810 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
27820 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
27830 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
27840 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
27850 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
27860 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
27870 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
27880 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
27890 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
278a0 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
278b0 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
278c0 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
278d0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
278e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
278f0 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
27900 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
27910 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
27920 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
27930 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
27940 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
27950 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
27960 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
27970 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
27980 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
27990 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
279a0 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
279b0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
279c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
279d0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
279e0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
279f0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
27a00 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
27a10 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
27a20 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
27a30 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
27a40 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
27a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27a60 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
27a70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27a80 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
27a90 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
27aa0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27ab0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27ad0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
27ae0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
27af0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
27b00 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
27b10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27b30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27b40 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
27b50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27b60 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
27b70 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
27b80 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27b90 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
27ba0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
27bb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
27bc0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
27bd0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
27be0 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
27bf0 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
27c00 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
27c10 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
27c20 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
27c30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
27c40 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
27c50 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
27c60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
27c70 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
27c80 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
27c90 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
27ca0 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
27cb0 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
27cc0 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
27cd0 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
27ce0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
27cf0 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
27d00 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
27d10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27d20 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
27d30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27d40 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
27d50 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
27d60 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
27d70 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
27d80 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
27d90 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
27da0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
27db0 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
27dc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27dd0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
27de0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27df0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
27e00 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
27e10 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
27e20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27e30 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
27e40 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
27e50 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
27e60 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
27e70 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
27e80 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
27e90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27ea0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
27eb0 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
27ec0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
27ed0 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
27ee0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
27ef0 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
27f00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
27f10 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
27f20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
27f30 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
27f40 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
27f50 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
27f60 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
27f70 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
27f80 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
27f90 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
27fa0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
27fb0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
27fc0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
27fd0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
27fe0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
27ff0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28000 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
28010 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
28020 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
28030 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
28040 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
28050 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
28060 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
28070 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
28080 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
28090 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
280a0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
280b0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
280c0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
280d0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
280e0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
280f0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
28100 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
28110 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
28120 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
28130 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
28140 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
28150 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
28160 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
28170 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
28180 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
28190 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
281a0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
281b0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
281c0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
281d0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
281e0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
281f0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
28200 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
28210 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
28220 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
28230 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
28240 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
28250 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
28260 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28270 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
28280 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
28290 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
282a0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
282b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
282c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
282d0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
282e0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
282f0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
28300 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
28310 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
28320 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
28330 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
28340 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
28350 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
28360 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
28370 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
28380 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
28390 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
283a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
283b0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
283c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
283d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
283e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
283f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
28400 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
28410 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
28420 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28430 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28450 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28460 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
28470 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28480 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
28490 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
284a0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
284b0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
284c0 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
284d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
284e0 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
284f0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
28500 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
28510 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
28520 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28530 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
28540 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
28550 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
28560 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28570 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
28580 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
28590 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
285a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
285b0 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
285c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
285d0 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
285e0 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
285f0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
28600 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
28610 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
28620 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
28630 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
28640 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
28650 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
28660 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
28670 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
28680 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
28690 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
286a0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
286b0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
286c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
286d0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
286e0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
286f0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
28700 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
28710 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
28720 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
28730 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
28740 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
28750 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
28760 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
28770 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
28780 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
28790 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
287a0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
287b0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
287c0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
287d0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
287e0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
287f0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
28800 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
28810 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
28820 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
28830 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
28840 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
28850 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
28860 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43  PayloadFetch(BtC
28870 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28880 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
28890 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
288a0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
288b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
288c0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
288d0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
288e0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
288f0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
28900 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
28910 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
28920 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
28930 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28940 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
28950 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
28960 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
28970 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
28980 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
28990 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
289a0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
289b0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
289c0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
289d0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
289e0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
289f0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
28a00 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
28a10 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
28a20 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
28a30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28a40 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
28a50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
28a60 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
28a70 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28a80 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28aa0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28ab0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28ac0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28ad0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
28ae0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
28af0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28b00 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
28b10 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
28b20 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
28b30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28b40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28b50 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
28b60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28b70 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28b80 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
28b90 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28ba0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
28bb0 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  +;.  pCur->aiIdx
28bc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
28bd0 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
28be0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
28bf0 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
28c00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28c10 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
28c30 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
28c40 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
28c50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28c60 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
28c70 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
28c80 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
28c90 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
28ca0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
28cb0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
28cc0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
28cd0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
28ce0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
28cf0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
28d00 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
28d10 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
28d20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
28d30 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
28d40 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
28d50 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
28d60 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
28d70 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
28d80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
28d90 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
28da0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
28db0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
28dc0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
28dd0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
28de0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
28df0 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
28e00 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
28e10 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
28e40 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
28e50 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
28e60 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
28e70 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
28e80 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
28e90 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
28ea0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
28eb0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
28ec0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
28ed0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
28ee0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
28ef0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
28f00 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
28f10 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
28f20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
28f30 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
28f40 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
28f50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28f60 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
28f70 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
28f80 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
28f90 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
28fa0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
28fb0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
28fc0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
28fd0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
28fe0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
28ff0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
29000 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
29010 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
29020 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
29030 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
29040 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
29050 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
29060 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
29070 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
29080 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
29090 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
290a0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
290b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
290c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
290d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
290e0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
290f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29100 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29110 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
29120 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
29130 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29140 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
29150 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29160 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
29170 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
29180 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
29190 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
291a0 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
291b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
291c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
291d0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
291e0 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
291f0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29200 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29210 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
29220 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29230 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  fl);.  releasePa
29240 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
29250 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29260 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge--]);.}../*.**
29270 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29280 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
29290 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
292a0 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
292b0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
292c0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
292d0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
292e0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
292f0 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
29300 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
29310 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
29320 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
29330 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
29340 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
29350 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
29360 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
29370 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
29380 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
29390 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
293a0 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
293b0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
293c0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
293d0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
293e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
293f0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
29400 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
29410 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
29420 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
29430 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
29440 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
29450 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
29460 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
29470 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
29480 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
29490 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
294a0 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
294b0 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
294c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
294d0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
294e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
294f0 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
29500 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
29510 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
29520 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
29530 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
29540 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
29550 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
29560 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
29570 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
29580 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
29590 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
295a0 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
295b0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
295c0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
295d0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
295e0 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
295f0 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
29600 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
29610 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
29620 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
29630 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
29640 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
29650 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
29660 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
29670 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
29680 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
29690 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
296a0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
296b0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
296c0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
296d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
296e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
296f0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29700 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29710 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
29720 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
29730 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
29740 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
29750 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
29760 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
29770 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
29780 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
29790 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
297a0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
297b0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
297c0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
297d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
297e0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61  FAULT ){.      a
297f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
29800 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
29810 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
29820 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
29830 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29840 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
29850 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20  or(pCur);.  }.. 
29860 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
29870 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
29880 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
29890 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
298a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
298b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
298c0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
298d0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
298e0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
298f0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
29900 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70  .      }while( p
29910 43 75 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20  Cur->iPage);.   
29920 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69     goto skip_ini
29930 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
29940 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
29950 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
29960 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29970 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
29980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29990 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
299a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
299b0 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
299c0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
299d0 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
299e0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
299f0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
29a00 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
29a30 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
29a40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29a50 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
29a60 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29a70 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
29a80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
29a90 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
29aa0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
29ab0 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
29ac0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
29ad0 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
29ae0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29af0 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
29b00 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
29b10 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
29b20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
29b30 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
29b40 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
29b50 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
29b60 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
29b70 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
29b80 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
29b90 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
29ba0 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
29bb0 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
29bc0 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
29bd0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
29be0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
29bf0 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
29c00 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
29c10 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
29c20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
29c30 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
29c40 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
29c50 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
29c60 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
29c70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
29c80 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
29c90 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
29ca0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
29cb0 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
29cc0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
29cd0 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
29ce0 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
29cf0 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
29d00 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
29d10 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
29d20 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
29d30 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
29d40 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
29d50 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
29d60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
29d70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
29d80 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
29d90 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
29da0 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
29db0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
29dc0 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
29dd0 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
29de0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29df0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70  _BKPT;.  }..skip
29e00 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d  _init:  .  pCur-
29e10 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
29e20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29e30 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
29e40 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
29e50 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
29e60 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
29e70 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f  idOvfl);..  pRoo
29e80 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
29e90 5b 30 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  [0];.  if( pRoot
29ea0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
29eb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29ec0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
29ed0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
29ee0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
29ef0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
29f00 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
29f10 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
29f20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29f30 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
29f40 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
29f50 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
29f60 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
29f70 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29f80 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
29f90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
29fa0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
29fb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29fc0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29fd0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29fe0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29ff0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2a000 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2a010 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
2a020 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2a030 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
2a040 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2a050 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2a060 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
2a070 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
2a080 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
2a090 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
2a0a0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
2a0b0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2a0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2a0d0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
2a0e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2a0f0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2a100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a110 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2a120 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2a130 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2a140 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2a150 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a160 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a170 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2a180 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2a190 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2a1a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
2a1b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
2a1c0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2a1d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
2a1e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2a1f0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2a200 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2a210 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2a220 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
2a230 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2a240 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2a250 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a260 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2a270 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
2a280 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2a290 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2a2a0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
2a2b0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
2a2c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2a2d0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
2a2e0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
2a2f0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
2a300 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
2a310 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
2a320 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
2a330 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
2a340 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2a350 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
2a360 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
2a370 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
2a380 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2a390 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2a3a0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
2a3b0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
2a3c0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
2a3d0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2a3e0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
2a3f0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
2a400 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
2a410 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
2a420 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
2a430 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2a440 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2a450 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a460 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2a470 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2a480 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a490 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a4a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a4b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2a4c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
2a4d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2a4e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
2a4f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2a500 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
2a510 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2a520 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2a530 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
2a540 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2a550 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
2a560 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2a570 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2a580 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2a590 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
2a5a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a5b0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
2a5c0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
2a5d0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2a5e0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
2a5f0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2a600 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2a610 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
2a620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a630 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2a640 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
2a650 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2a660 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2a670 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2a680 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2a690 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2a6a0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2a6b0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2a6c0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2a6d0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2a6e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2a6f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2a700 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
2a710 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2a720 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
2a730 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2a740 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2a750 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2a770 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2a780 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2a790 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2a7a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2a7b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a7c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2a7d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2a7e0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
2a7f0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2a800 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2a810 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a820 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2a830 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2a840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a850 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a860 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a870 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
2a880 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2a890 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
2a8a0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2a8b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2a8c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2a8d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a8e0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2a8f0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2a900 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2a910 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2a920 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2a930 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2a940 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2a950 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2a960 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2a970 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2a980 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2a990 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
2a9a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a9b0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2a9c0 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
2a9d0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a9e0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a9f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2aa00 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2aa10 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2aa20 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
2aa30 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
2aa40 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
2aa50 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
2aa60 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
2aa70 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
2aa80 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2aa90 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
2aaa0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2aab0 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
2aac0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2aad0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
2aae0 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
2aaf0 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
2ab00 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
2ab10 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
2ab20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2ab30 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
2ab40 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
2ab50 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
2ab60 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
2ab70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ab80 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
2ab90 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
2aba0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2abb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2abc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2abd0 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
2abe0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2abf0 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
2ac00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ac10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ac20 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
2ac30 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2ac40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2ac50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2ac60 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2ac70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ac80 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2ac90 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2aca0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
2acb0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2acc0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2acd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ace0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2acf0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2ad00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ad10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ad20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ad30 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
2ad40 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2ad50 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2ad60 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2ad70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ad80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2ad90 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2ada0 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
2adb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2adc0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2add0 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
2ade0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20  t;.      }.   . 
2adf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ae00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2ae10 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
2ae20 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2ae30 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
2ae40 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
2ae50 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
2ae60 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
2ae70 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
2ae80 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
2ae90 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
2aea0 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
2aeb0 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
2aec0 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
2aed0 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
2aee0 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
2aef0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
2af00 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
2af10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2af20 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
2af30 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
2af40 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
2af50 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
2af60 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
2af70 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
2af80 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
2af90 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
2afa0 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
2afb0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2afc0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
2afd0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
2afe0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
2aff0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
2b000 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2b010 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
2b020 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2b030 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
2b040 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
2b050 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
2b060 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
2b070 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
2b080 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
2b090 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
2b0a0 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
2b0b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2b0c0 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
2b0d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2b0e0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2b0f0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
2b120 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
2b130 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
2b140 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
2b150 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
2b160 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
2b170 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
2b180 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
2b190 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
2b1a0 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
2b1b0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b1c0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2b1d0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2b1e0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
2b1f0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
2b200 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
2b210 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
2b220 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2b230 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2b240 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2b260 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
2b270 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2b280 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61  .** For index ta
2b290 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65  bles, the pIdxKe
2b2a0 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20  y->eqSeen field 
2b2b0 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  is set to 1 if t
2b2c0 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61  here.** exists a
2b2d0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
2b2e0 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c  able that exactl
2b2f0 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65  y matches pIdxKe
2b300 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
2b310 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2b320 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
2b330 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2b340 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2b350 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
2b360 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2b370 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
2b380 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2b390 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
2b3a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2b3b0 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
2b3c0 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
2b3d0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2b3e0 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
2b3f0 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
2b400 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
2b410 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
2b420 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2b430 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
2b440 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2b450 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
2b460 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
2b470 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
2b480 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2b490 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2b4a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b4b0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2b4c0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2b4d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b4e0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
2b4f0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
2b500 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2b510 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
2b520 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2b530 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
2b540 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
2b550 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29  r->curIntKey!=0)
2b560 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2b570 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2b580 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
2b590 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
2b5a0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
2b5b0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
2b5c0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
2b5d0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
2b5e0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b  k */.  if( pIdxK
2b5f0 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72  ey==0.   && pCur
2b600 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2b610 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
2b620 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2b630 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
2b640 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2b650 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2b660 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2b670 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
2b680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b690 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2b6a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
2b6b0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66  tKey ){.      if
2b6c0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2b6d0 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2b6e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  !=0 ){.        *
2b6f0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2b700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b710 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2b720 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71     /* If the req
2b730 75 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e  uested key is on
2b740 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
2b750 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68  previous key, th
2b760 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20  en.      ** try 
2b770 74 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69  to get there usi
2b780 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  ng sqlite3BtreeN
2b790 65 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61  ext() rather tha
2b7a0 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a  n a full.      *
2b7b0 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e  * binary search.
2b7c0 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
2b7d0 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
2b7e0 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
2b7f0 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  wer.      ** is 
2b800 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77  still obtained w
2b810 69 74 68 6f 75 74 20 74 68 69 73 20 61 73 65 2c  ithout this ase,
2b820 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d   only a little m
2b830 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20  ore slowely */. 
2b840 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2b850 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b  nfo.nKey+1==intK
2b860 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69  ey && !pCur->ski
2b870 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
2b880 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2b890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b8a0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2b8b0 70 52 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  pRes);.        i
2b8c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b8d0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  c;.        if( *
2b8e0 70 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRes==0 ){.     
2b8f0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
2b900 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  (pCur);.        
2b910 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2b920 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2b930 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2b940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b950 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b960 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b970 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
2b980 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
2b990 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
2b9a0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
2b9b0 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
2b9c0 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
2b9d0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
2b9e0 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
2b9f0 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
2ba00 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2ba10 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
2ba20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2ba30 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2ba40 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
2ba50 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
2ba60 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
2ba70 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
2ba80 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
2ba90 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2baa0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2bab0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2bac0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2bad0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2bae0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2baf0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
2bb00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2bb10 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2bb20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2bb30 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
2bb40 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2bb50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bb60 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
2bb70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2bb80 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2bb90 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
2bba0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2bbb0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2bbc0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2bbd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2bbe0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2bbf0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2bc00 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2bc10 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2bc20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2bc30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2bc40 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2bc50 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2bc60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2bc70 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2bc80 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2bc90 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2bca0 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2bcb0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2bcc0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2bcd0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2bce0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bcf0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2bd20 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2bd30 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
2bd40 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
2bd50 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
2bd60 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
2bd70 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2bd80 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2bd90 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
2bda0 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
2bdb0 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
2bdc0 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
2bdd0 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
2bde0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2bdf0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
2be00 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
2be10 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
2be20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
2be30 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
2be40 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
2be50 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
2be60 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
2be70 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
2be80 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
2be90 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
2bea0 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
2beb0 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
2bec0 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
2bed0 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
2bee0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
2bef0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
2bf00 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2bf10 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
2bf20 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2bf30 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
2bf40 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
2bf50 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
2bf60 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
2bf70 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
2bf80 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
2bf90 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
2bfa0 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
2bfb0 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
2bfc0 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
2bfd0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2bfe0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2bff0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c000 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
2c010 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
2c020 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
2c030 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
2c040 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2c050 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c060 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2c070 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
2c080 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2c090 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2c0a0 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
2c0b0 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
2c0c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2c0d0 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
2c0e0 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
2c0f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c100 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2c110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c120 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
2c130 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
2c140 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2c150 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
2c160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2c170 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2c180 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2c190 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
2c1a0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2c1b0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
2c1c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2c1d0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c1e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2c1f0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
2c200 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2c210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c220 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2c230 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
2c240 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2c250 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c260 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2c270 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2c280 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c290 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2c2a0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
2c2b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
2c2c0 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
2c2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c2e0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2c2f0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2c300 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
2c310 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2c320 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2c330 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c340 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c350 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2c360 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2c370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c380 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2c390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c3a0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2c3b0 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2c3c0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c3d0 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2c3e0 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2c3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c400 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2c410 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
2c420 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
2c430 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
2c440 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2c450 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c460 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2c470 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  , idx);..       
2c480 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
2c490 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
2c4a0 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
2c4b0 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
2c4c0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
2c4d0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
2c4e0 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
2c4f0 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
2c500 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
2c510 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
2c520 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
2c530 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
2c540 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
2c550 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
2c560 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
2c570 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
2c580 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
2c590 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
2c5a0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2c5b0 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
2c5c0 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
2c5d0 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
2c5e0 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
2c5f0 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
2c600 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
2c610 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
2c620 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
2c630 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
2c640 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
2c650 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2c660 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
2c670 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
2c680 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
2c690 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
2c6a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2c6b0 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
2c6c0 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
2c6d0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
2c6e0 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
2c6f0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
2c700 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2c710 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
2c720 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2c730 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
2c740 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2c750 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2c760 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2c770 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
2c780 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2c790 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2c7a0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2c7b0 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
2c7c0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2c7d0 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
2c7e0 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
2c7f0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
2c800 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
2c810 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
2c820 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
2c830 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
2c840 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2c850 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2c860 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
2c870 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2c880 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
2c890 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2c8a0 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
2c8b0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2c8c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c8d0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
2c8e0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2c8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2c900 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2c910 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2c920 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
2c930 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2c940 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2c950 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
2c960 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
2c970 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
2c980 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
2c990 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
2c9a0 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
2c9b0 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
2c9c0 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
2c9d0 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
2c9e0 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
2c9f0 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
2ca00 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
2ca10 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
2ca20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
2ca30 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
2ca40 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
2ca50 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20   called. .      
2ca60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2ca70 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   ** If the recor
2ca80 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68  d is corrupt, th
2ca90 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2caa0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61   routine may rea
2cab0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  d.          ** u
2cac0 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
2cad0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2cae0 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20   the buffer. An 
2caf0 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20  extra 18 .      
2cb00 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
2cb10 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63  padding is alloc
2cb20 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ated at the end 
2cb30 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  of the buffer in
2cb40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
2cb50 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  se this happens.
2cb60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76    */.          v
2cb70 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
2cb80 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
2cb90 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
2cba0 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
2cbb0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
2cbc0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
2cbd0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
2cbe0 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
2cbf0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
2cc00 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
2cc10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
2cc20 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2cc30 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
2cc40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
2cc50 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
2cc60 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
2cc70 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2cc80 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
2cc90 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2cca0 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
2ccb0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2ccc0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
2ccd0 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2cce0 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2ccf0 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
2cd00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2cd10 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
2cd20 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
2cd30 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
2cd40 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
2cd50 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ll<2 ){.        
2cd60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2cd70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2cd80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2cd90 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2cda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cdb0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
2cdc0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
2cdd0 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20  ell+18 );.      
2cde0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
2cdf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2ce00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2ce10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2ce20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2ce30 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2ce40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ce50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2ce60 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2ce70 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2ce80 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2ce90 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2cea0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2ceb0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b  r*)pCellKey, 0);
2cec0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2ced0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2cee0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
2cef0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2cf00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2cf10 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2cf20 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2cf30 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2cf40 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2cf50 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2cf60 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2cf70 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2cf80 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2cf90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2cfa0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2cfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2cfc0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2cfd0 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2cfe0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2cff0 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2d000 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2d010 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2d020 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2d030 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2d040 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2d050 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2d060 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2d070 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2d080 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2d090 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2d0a0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2d0b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d0c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d0d0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2d0e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2d0f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d110 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2d120 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2d130 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2d140 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2d150 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2d160 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2d170 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2d180 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2d190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d1a0 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2d1b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2d1c0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2d1d0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2d1e0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2d1f0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2d200 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2d210 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2d220 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2d230 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2d240 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2d250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2d260 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2d270 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2d280 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2d290 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2d2a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
2d2b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d2c0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
2d2d0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
2d2e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2d2f0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2d300 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2d310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d320 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2d330 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2d340 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2d350 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2d360 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2d370 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2d380 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2d390 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2d3a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2d3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d3c0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2d3d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2d3e0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2d3f0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2d400 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2d410 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2d420 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2d430 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2d440 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2d450 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2d460 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2d470 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73  nSize = 0;.  ass
2d480 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2d490 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2d4a0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72  dOvfl)==0 );.  r
2d4b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2d4c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2d4d0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2d4e0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2d4f0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2d500 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2d510 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2d520 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2d530 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2d540 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2d550 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2d560 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2d570 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2d580 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2d590 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2d5a0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2d5b0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2d5c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2d5d0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2d5e0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2d5f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2d600 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2d610 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2d620 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2d630 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2d640 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2d650 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2d660 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2d670 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2d680 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2d690 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2d6a0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2d6b0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2d6c0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2d6d0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2d6e0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2d6f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
2d700 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20  stimate for the 
2d710 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2d720 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2d730 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e   pCur is.** poin
2d740 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e  ting to.  Return
2d750 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2d760 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74  er if no estimat
2d770 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  e is currently .
2d780 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  ** available..*/
2d790 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
2d7a0 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43  eRowCountEst(BtC
2d7b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2d7c0 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a  i64 n;.  u8 i;..
2d7d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d7e0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2d7f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d810 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2d820 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2d830 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74    /* Currently t
2d840 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
2d850 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
2d860 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72  the OP_IfSmaller
2d870 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e  .  ** opcode, an
2d880 64 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74  d it that case t
2d890 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61  he cursor will a
2d8a0 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61  lways be valid a
2d8b0 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77  nd.  ** will alw
2d8c0 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c  ays point to a l
2d8d0 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69  eaf node. */.  i
2d8e0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  f( NEVER(pCur->e
2d8f0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d900 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31  LID) ) return -1
2d910 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
2d920 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d930 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
2d940 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a  ) ) return -1;..
2d950 20 20 66 6f 72 28 6e 3d 31 2c 20 69 3d 30 3b 20    for(n=1, i=0; 
2d960 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
2d970 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70  i++){.    n *= p
2d980 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
2d990 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  nCell;.  }.  ret
2d9a0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
2d9b0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
2d9c0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
2d9d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2d9e0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2d9f0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2da00 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2da10 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2da20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2da30 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2da40 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2da50 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2da60 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2da70 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2da80 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2da90 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2daa0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2dab0 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2dac0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2dad0 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2dae0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2daf0 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2db00 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2db10 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2db20 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2db30 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2db40 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2db50 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2db60 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2db70 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2db80 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2db90 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2dba0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2dbb0 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2dbc0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2dbd0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2dbe0 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2dbf0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2dc00 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2dc10 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2dc20 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2dc30 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2dc40 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2dc50 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2dc60 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2dc70 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2dc80 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2dc90 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2dca0 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2dcb0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2dcc0 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2dcd0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2dce0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2dcf0 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2dd00 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2dd10 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2dd20 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2dd30 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2dd40 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2dd50 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2dd60 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2dd70 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2dd80 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2dd90 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2dda0 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2ddb0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2ddc0 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2ddd0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2dde0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2ddf0 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2de00 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2de10 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74  NE int btreeNext
2de20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2de30 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2de40 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
2de50 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2de60 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2de70 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2de80 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2de90 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2dea0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2deb0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2dec0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2ded0 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2dee0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2def0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2df00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
2df10 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2df20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2df30 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
2df40 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2df50 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2df60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2df70 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2df80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2df90 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2dfa0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2dfb0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2dfc0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2dfd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2dfe0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2dff0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2e000 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2e010 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2e020 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2e030 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2e040 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2e050 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e060 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2e070 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2e080 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2e090 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2e0a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2e0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2e0d0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2e0e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2e0f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2e100 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2e110 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
2e120 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e130 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2e140 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2e150 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
2e160 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2e170 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
2e180 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
2e190 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
2e1a0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
2e1b0 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
2e1c0 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
2e1d0 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
2e1e0 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
2e1f0 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
2e200 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
2e210 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
2e220 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
2e230 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
2e240 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2e250 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
2e260 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
2e270 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
2e280 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
2e290 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
2e2a0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
2e2b0 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
2e2c0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
2e2d0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
2e2e0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
2e2f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e300 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2e310 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2e320 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2e330 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2e340 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
2e350 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2e360 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
2e370 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2e380 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2e390 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
2e3a0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2e3b0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2e3c0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
2e3d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2e3e0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2e3f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e400 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2e410 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2e420 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2e430 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2e440 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e450 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2e460 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e470 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2e480 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2e490 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2e4a0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2e4b0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2e4c0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2e4d0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2e4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e4f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2e500 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2e510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2e530 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2e540 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2e550 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e560 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2e570 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2e580 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2e590 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2e5a0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e5b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e5c0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2e5d0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2e5e0 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2e5f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2e600 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2e610 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e620 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2e630 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e640 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2e650 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2e660 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2e670 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70  ValidOvfl);.  *p
2e680 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
2e690 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2e6a0 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2e6b0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2e6c0 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67  r, pRes);.  pPag
2e6d0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2e6e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e6f0 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69   if( (++pCur->ai
2e700 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e710 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
2e720 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
2e730 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e740 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
2e750 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2e760 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  es);.  }.  if( p
2e770 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e790 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2e7a0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2e7b0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2e7c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
2e7d0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2e7e0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
2e7f0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
2e800 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2e810 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2e820 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2e830 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2e840 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2e850 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2e860 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2e870 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2e880 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2e890 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2e8a0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2e8b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2e8c0 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2e8d0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2e8e0 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2e8f0 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2e900 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2e910 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2e920 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2e930 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2e940 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2e950 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2e960 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2e970 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2e980 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2e990 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2e9a0 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2e9b0 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2e9c0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2e9d0 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2e9e0 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2e9f0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2ea00 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2ea10 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2ea20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2ea30 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2ea40 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2ea50 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2ea60 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2ea70 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2ea80 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2ea90 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2eaa0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2eab0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2eac0 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2ead0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2eae0 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2eaf0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2eb00 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2eb10 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2eb20 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2eb30 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2eb40 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2eb50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2eb60 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2eb70 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2eb80 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2eb90 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2eba0 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2ebb0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2ebc0 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2ebd0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2ebe0 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2ebf0 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2ec00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ec10 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2ec20 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2ec30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2ec40 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2ec50 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2ec60 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2ec70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2ec80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ec90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2eca0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ecb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ecc0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2ecd0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2ece0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ecf0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2ed00 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2ed10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2ed20 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2ed30 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2ed40 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2ed50 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2ed60 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
2ed70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ed80 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2ed90 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2eda0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2edb0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
2edc0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2edd0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2ede0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2edf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ee00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2ee10 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2ee20 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2ee30 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2ee40 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2ee50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ee60 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2ee70 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2ee80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ee90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2eea0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2eeb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2eec0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2eed0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2eee0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2eef0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2ef00 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
2ef10 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2ef20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2ef30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ef40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2ef50 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2ef60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2ef70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2ef80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ef90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2efa0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2efb0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2efc0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
2efd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2efe0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
2eff0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2f000 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
2f010 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2f020 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
2f030 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f040 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2f050 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2f060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
2f070 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2f080 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
2f090 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2f0a0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2f0b0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2f0c0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2f0d0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
2f0e0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2f0f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f110 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2f120 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2f130 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2f140 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2f150 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f160 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2f170 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
2f180 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  );..    pCur->ai
2f190 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2f1a0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
2f1b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2f1c0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
2f1d0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2f1e0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2f1f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2f200 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2f210 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2f220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2f250 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
2f260 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2f270 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2f280 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2f290 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f2a0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f2b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f2c0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2f2d0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2f2e0 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2f2f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2f300 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2f310 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2f320 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2f330 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2f340 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2f350 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2f360 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2f370 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2f380 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2f390 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2f3a0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2f3b0 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2f3c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2f3d0 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2f3e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2f3f0 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2f400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2f410 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2f420 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2f430 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2f440 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2f450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f460 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2f470 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2f480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f490 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2f4a0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2f4b0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2f4c0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2f4d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2f4e0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2f4f0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2f500 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2f510 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2f520 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2f530 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2f540 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2f550 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2f560 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2f570 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2f580 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2f590 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2f5a0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2f5b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2f5c0 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
2f5d0 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
2f5e0 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
2f5f0 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
2f600 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
2f610 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2f620 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
2f630 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
2f640 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2f650 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
2f660 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
2f670 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
2f680 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
2f690 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
2f6a0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
2f6b0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
2f6c0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
2f6d0 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
2f6e0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
2f6f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f700 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
2f710 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
2f720 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2f730 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
2f740 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
2f750 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
2f760 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
2f770 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
2f780 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
2f790 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2f7a0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
2f7b0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
2f7c0 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
2f7d0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
2f7e0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
2f7f0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
2f800 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2f810 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
2f820 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
2f830 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
2f840 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
2f850 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
2f860 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
2f870 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
2f880 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2f890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2f8a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
2f8b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2f8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f8d0 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
2f8e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
2f8f0 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
2f900 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
2f910 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
2f920 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
2f930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
2f940 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
2f950 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
2f960 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
2f970 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2f980 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
2f990 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
2f9a0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
2f9b0 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
2f9c0 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
2f9d0 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
2f9e0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
2f9f0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
2fa00 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
2fa10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2fa20 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2fa30 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
2fa40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fa50 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
2fa60 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
2fa70 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
2fa80 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
2fa90 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
2faa0 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
2fab0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
2fac0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2fad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2fae0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2faf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2fb00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2fb10 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2fb20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
2fb30 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
2fb40 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
2fb50 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
2fb60 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2fb70 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
2fb80 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2fb90 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
2fba0 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
2fbb0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
2fbc0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2fbd0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
2fbe0 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
2fbf0 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
2fc00 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2fc10 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
2fc20 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
2fc30 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2fc40 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
2fc50 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
2fc60 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
2fc70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2fc80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2fc90 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
2fca0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2fcb0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
2fcc0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
2fcd0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
2fce0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
2fcf0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
2fd00 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
2fd10 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
2fd20 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
2fd30 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
2fd40 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
2fd50 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
2fd60 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
2fd70 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
2fd80 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
2fd90 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
2fda0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
2fdb0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
2fdc0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2fdd0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
2fde0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2fdf0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
2fe00 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2fe10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
2fe20 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
2fe30 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
2fe40 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
2fe50 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2fe60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2fe70 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
2fe80 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2fe90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
2fea0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
2feb0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
2fec0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2fed0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
2fee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2fef0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2ff00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2ff10 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
2ff20 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
2ff30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2ff40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ff50 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
2ff60 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2ff70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
2ff80 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2ff90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ffa0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
2ffb0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2ffc0 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
2ffd0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
2ffe0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
2fff0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
30000 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
30010 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
30020 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
30030 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
30040 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
30050 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
30060 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
30070 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
30080 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30090 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
300a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
300b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
300c0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
300d0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
300e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
300f0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
30100 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
30110 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
30120 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
30130 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
30140 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
30150 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
30160 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
30170 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
30180 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
30190 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
301a0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
301b0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
301c0 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
301d0 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
301e0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
301f0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
30200 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
30210 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
30220 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
30230 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
30240 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
30250 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
30260 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
30270 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
30280 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
30290 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
302a0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
302b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
302c0 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
302d0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
302e0 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
302f0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
30300 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
30310 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30320 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
30330 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
30340 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
30350 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
30360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
30370 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
30380 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
30390 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
303a0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
303b0 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
303c0 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
303d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
303e0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
303f0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
30400 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
30410 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
30420 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
30430 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
30440 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
30450 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
30460 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
30470 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
30480 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
30490 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c  iTrunk>mxPage ||
304a0 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29   nSearch++ > n )
304b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
304c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
304d0 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
304e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
304f0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30500 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
30510 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
30520 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
30530 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
30540 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
30550 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30560 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
30570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
30580 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
30590 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
305a0 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
305b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
305c0 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
305d0 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
305e0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
305f0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
30600 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
30610 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
30620 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
30630 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
30640 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
30650 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
30660 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
30670 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
30680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
30690 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
306a0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
306b0 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
306c0 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
306d0 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
306e0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
306f0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
30700 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
30710 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
30720 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
30730 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
30740 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
30750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30760 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
30770 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30780 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30790 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
307a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
307b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
307c0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
307d0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
307e0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
307f0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
30800 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30810 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
30820 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
30830 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
30840 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30850 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
30860 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
30870 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
30880 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
30890 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
308a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
308b0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
308c0 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
308d0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
308e0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
308f0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
30900 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30910 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
30920 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30930 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
30940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30950 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
30960 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
30970 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
30980 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
30990 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
309a0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
309b0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
309c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
309d0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
309e0 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
309f0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
30a00 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
30a10 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
30a20 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
30a30 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
30a40 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
30a50 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
30a60 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
30a70 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
30a80 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
30a90 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
30aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30ab0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
30ac0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
30ad0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
30ae0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30af0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30b00 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
30b10 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
30b20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
30b30 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
30b40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30b50 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30b60 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
30b70 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30b80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30b90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30ba0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30bb0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
30bc0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30bd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30bf0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
30c00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
30c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30c20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
30c30 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
30c40 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
30c50 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30c80 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
30c90 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
30ca0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
30cb0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
30cc0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
30cd0 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
30ce0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
30cf0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
30d00 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
30d10 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
30d20 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
30d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
30d40 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
30d50 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
30d60 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
30d70 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
30d80 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
30d90 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
30da0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
30db0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30dc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30dd0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
30de0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30df0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
30e00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
30e10 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
30e20 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
30e30 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30e40 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30e50 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
30e60 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
30e70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
30e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30e90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30ea0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30ec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30ed0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30ee0 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
30ef0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
30f00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
30f20 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
30f30 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
30f40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30f50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30f70 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
30f80 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
30f90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30fa0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
30fb0 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
30fc0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
30fd0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
30fe0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
30ff0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
31000 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
31010 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
31020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31030 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
31040 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
31050 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
31060 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
31070 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31080 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
31090 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
310a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
310b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
310c0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
310d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
310e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
310f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31100 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
31110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31120 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31130 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31140 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31150 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
31160 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
31170 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
31180 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
31190 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
311a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
311b0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
311c0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
311d0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
311e0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
311f0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
31200 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
31210 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
31220 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
31230 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
31240 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
31250 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
31260 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
31270 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
31280 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
31290 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
312a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
312b0 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
312c0 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
312d0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
312e0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
312f0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
31300 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
31310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
31320 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
31330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31340 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
31350 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
31360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31370 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
31380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31390 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
313a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
313b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
313c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
313d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
313e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
313f0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
31400 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
31410 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
31420 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
31430 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
31440 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
31450 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
31470 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
31480 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
31490 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
314a0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
314b0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
314c0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
314d0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
314e0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
314f0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
31500 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31540 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
31550 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
31560 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
31570 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
31580 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
31590 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
315a0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
315b0 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
315c0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
315d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
315e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
315f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31600 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
31620 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
31630 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
31640 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
31650 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
31660 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
31670 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
31680 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
31690 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
316a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
316b0 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
316c0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
316d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
316e0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
316f0 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
31700 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
31710 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
31720 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
31730 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
31740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
31750 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
31760 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
31770 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
31780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31790 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
317a0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
317b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
317c0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
317d0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
317e0 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
317f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
31800 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
31810 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
31820 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
31830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31840 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31850 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
31860 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
31870 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
31880 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
31890 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
318a0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
318b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
318c0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
318d0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
318e0 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
318f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
31900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31920 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31930 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
31940 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31970 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
31980 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
319a0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
319b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
319c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
319d0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
319e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
319f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
31a00 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
31a10 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
31a20 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
31a30 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
31a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
31a50 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
31a60 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31a70 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
31a80 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
31a90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
31aa0 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
31ab0 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
31ac0 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
31ad0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
31ae0 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
31af0 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
31b00 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
31b10 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
31b20 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
31b30 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
31b40 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
31b50 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
31b60 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
31b70 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
31b80 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
31b90 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
31ba0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
31bb0 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
31bc0 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
31bd0 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
31be0 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
31bf0 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
31c00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
31c10 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
31c20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
31c30 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
31c40 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
31c50 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
31c60 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
31c70 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
31c80 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
31c90 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
31ca0 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
31cb0 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
31cc0 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
31cd0 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
31ce0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
31cf0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
31d00 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
31d10 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
31d20 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
31d30 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
31d40 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
31d50 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
31d60 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
31d70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31d80 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
31d90 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
31da0 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
31db0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
31dc0 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
31dd0 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
31de0 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
31df0 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
31e00 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
31e10 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
31e20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
31e30 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
31e40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31e50 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
31e60 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
31e70 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
31e80 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
31e90 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
31ea0 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
31eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31ec0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
31ed0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31ee0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31ef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
31f00 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
31f10 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
31f20 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31f30 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
31f40 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
31f50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31f60 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
31f70 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
31f80 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
31f90 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
31fa0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
31fb0 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
31fc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
31fd0 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
31fe0 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
31ff0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
32000 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
32010 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
32020 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
32030 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
32040 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
32050 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
32060 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
32070 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
32080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
32090 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
320a0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
320b0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
320c0 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
320d0 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
320e0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
320f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
32100 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
32110 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
32120 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
32130 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
32140 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
32150 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
32160 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
32170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32180 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32190 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
321a0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
321b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
321c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
321d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
321e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
321f0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
32200 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
32210 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
32220 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
32230 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
32240 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32250 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
32260 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
32270 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
32280 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
32290 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
322a0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
322b0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
322c0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
322d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
322e0 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
322f0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
32300 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
32310 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32320 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
32330 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
32340 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
32350 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32370 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
32380 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
32390 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
323a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
323b0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
323c0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
323d0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
323e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
323f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32400 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
32410 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
32420 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
32430 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
32440 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
32450 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
32460 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
32470 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
32480 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
32490 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61  bPage)<=1 );.  a
324a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
324b0 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65  E_OK || (*ppPage
324c0 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  )->isInit==0 );.
324d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
324e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
324f0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
32500 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
32510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32520 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
32530 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
32540 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
32550 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
32560 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
32570 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
32580 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
32590 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
325a0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
325b0 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
325c0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
325d0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
325e0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
325f0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
32600 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
32610 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
32620 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
32630 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
32640 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
32650 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
32660 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
32670 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
32680 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
32690 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
326a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
326b0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
326c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
326d0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
326e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
326f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
32700 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
32710 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
32720 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
32730 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
32740 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
32750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32760 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
32770 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
32780 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
32790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
327a0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
327b0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
327c0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
327d0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
327e0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
327f0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
32800 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
32810 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32830 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
32840 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
32850 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
32860 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
32870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32880 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
32890 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
328a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
328c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
328d0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
328e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
328f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
32900 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
32910 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
32920 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20  T_DB || iPage>1 
32930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
32940 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
32950 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
32960 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c  );..  if( iPage<
32970 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
32980 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32990 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
329a0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
329b0 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
329c0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
329d0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
329e0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
329f0 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
32a00 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
32a10 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
32a20 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
32a30 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
32a40 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
32a50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
32a60 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
32a70 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32a80 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
32a90 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
32aa0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32ab0 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
32ac0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32ad0 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
32ae0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
32af0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
32b00 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
32b10 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
32b20 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
32b30 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
32b40 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
32b50 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
32b60 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
32b70 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
32b80 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
32b90 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
32ba0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
32bb0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
32bc0 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
32bd0 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
32be0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32bf0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
32c00 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
32c10 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32c20 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
32c30 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
32c40 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
32c50 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
32c60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
32c70 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
32c80 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
32c90 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
32ca0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
32cb0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
32cc0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
32cd0 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
32ce0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
32cf0 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
32d00 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
32d10 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
32d20 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
32d30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
32d40 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
32d50 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
32d60 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
32d70 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
32d80 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
32d90 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
32da0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
32db0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
32dc0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
32dd0 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
32de0 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
32df0 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
32e00 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
32e10 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
32e20 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
32e30 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
32e40 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
32e50 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
32e60 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
32e70 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
32e80 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
32e90 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
32ea0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
32eb0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
32ec0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
32ed0 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
32ee0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
32ef0 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
32f00 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
32f10 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
32f20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
32f30 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
32f40 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
32f50 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
32f60 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
32f70 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32f80 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
32f90 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
32fa0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
32fb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
32fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32fd0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32fe0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
32ff0 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
33000 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
33010 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
33020 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
33030 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
33040 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
33050 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
33060 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
33070 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33080 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
33090 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
330a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
330b0 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
330c0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
330d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
330e0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
330f0 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
33100 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
33110 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
33120 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
33130 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
33140 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33150 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
33160 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
33170 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
33180 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
33190 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
331a0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
331b0 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
331c0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
331d0 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
331e0 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
331f0 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
33200 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
33210 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
33220 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
33230 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
33240 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
33250 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
33260 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
33270 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
33280 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
33290 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
332a0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
332b0 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
332c0 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
332d0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
332e0 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
332f0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
33300 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
33310 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
33320 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
33330 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
33340 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
33350 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
33360 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
33370 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
33380 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
33390 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
333a0 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
333b0 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
333c0 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
333d0 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
333e0 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
333f0 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
33400 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
33410 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
33420 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
33430 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
33440 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
33450 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
33460 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
33470 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
33480 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
33490 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
334a0 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
334b0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
334c0 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
334d0 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
334e0 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
334f0 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
33500 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
33510 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
33520 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
33530 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
33540 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
33550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33560 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
33570 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
33580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
335a0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
335b0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
335c0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
335d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
335e0 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
335f0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
33600 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
33610 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33620 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
33630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
33640 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
33650 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
33660 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
33670 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
33680 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
33690 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
336a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
336b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
336c0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
336d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
336e0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
336f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
33700 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33710 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
33720 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
33730 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
33740 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
33750 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
33760 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
33770 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
33780 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
33790 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
337a0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
337b0 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
337c0 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
337d0 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
337e0 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
337f0 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
33800 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
33810 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
33820 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
33830 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
33840 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
33850 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
33860 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
33870 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
33880 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
33890 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
338a0 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
338b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
338c0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
338d0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
338e0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
338f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33900 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
33910 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
33920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33930 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
33940 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
33950 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
33960 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
33970 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
33980 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
33990 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
339a0 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
339b0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
339c0 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
339d0 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
339e0 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
339f0 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
33a00 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
33a10 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
33a20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
33a30 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
33a40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
33a50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
33a60 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
33a70 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
33a80 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
33a90 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
33aa0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
33ab0 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
33ac0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
33ad0 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
33ae0 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
33af0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
33b00 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
33b10 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
33b20 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
33b30 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72   given Cell.  Wr
33b40 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c  ite the.** local
33b50 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20   Cell size (the 
33b60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
33b70 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  on the original 
33b80 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a  page, omitting.*
33b90 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f  * overflow) into
33ba0 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61   *pnSize..*/.sta
33bb0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
33bc0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
33bd0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
33be0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
33bf0 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c  ontains the Cell
33c00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
33c10 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f  har *pCell,    /
33c20 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
33c30 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65  the Cell */.  Ce
33c40 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
33c50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69         /* Size i
33c60 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
33c70 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
33c80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33c90 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
33ca0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
33cb0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
33cc0 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
33cd0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
33ce0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33cf0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
33d00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
33d10 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
33d20 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
33d30 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49  pInfo);.  if( pI
33d40 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e  nfo->nLocal==pIn
33d50 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a  fo->nPayload ){.
33d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33d70 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
33d80 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
33d90 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
33da0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
33db0 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 70 49  }.  if( pCell+pI
33dc0 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70  nfo->nSize-1 > p
33dd0 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
33de0 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20  e->maskPage ){. 
33df0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33e00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
33e10 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
33e20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
33e30 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
33e40 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
33e50 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69  ell + pInfo->nSi
33e60 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72  ze - 4);.  asser
33e70 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
33e80 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
33e90 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
33ea0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
33eb0 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f    nOvfl = (pInfo
33ec0 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e  ->nPayload - pIn
33ed0 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  fo->nLocal + ovf
33ee0 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
33ef0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
33f00 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c  ssert( nOvfl>0 |
33f10 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f  | .    (CORRUPT_
33f20 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50  DB && (pInfo->nP
33f30 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67  ayload + ovflPag
33f40 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53  eSize)<ovflPageS
33f50 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c  ize).  );.  whil
33f60 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
33f70 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
33f80 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
33f90 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
33fa0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
33fb0 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
33fc0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
33fd0 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
33fe0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
33ff0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
34000 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
34010 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
34020 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
34030 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
34040 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
34050 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
34060 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
34070 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
34080 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
34090 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
340a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
340b0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
340c0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
340d0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
340e0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
340f0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
34100 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
34110 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
34120 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
34130 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
34140 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
34150 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
34160 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
34170 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
34180 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
34190 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
341a0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
341b0 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
341c0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
341d0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
341e0 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
341f0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
34200 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
34210 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
34220 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
34230 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
34240 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
34250 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
34260 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
34270 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
34280 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
34290 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
342a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
342b0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
342c0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
342d0 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
342e0 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
342f0 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
34300 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
34310 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
34320 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
34330 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
34340 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
34350 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
34360 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
34370 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
34380 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
34390 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
343a0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
343b0 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
343c0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
343d0 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
343e0 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
343f0 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
34400 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
34410 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
34420 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34430 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
34440 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
34450 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
34460 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
34470 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
34480 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34490 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
344a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
344b0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
344c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
344d0 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
344e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
344f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
34500 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
34510 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
34520 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
34530 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
34540 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
34550 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
34560 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
34570 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
34580 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
34590 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
345a0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
345b0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
345c0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
345d0 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
345e0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
345f0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
34600 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
34610 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
34620 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
34630 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
34640 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
34650 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
34660 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
34670 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
34680 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
34690 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
346a0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
346b0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
346c0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
346d0 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
346e0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
346f0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
34700 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
34710 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
34720 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
34730 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
34740 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
34750 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
34760 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
34770 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
34780 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
34790 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
347a0 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61  onst BtreePayloa
347b0 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a  d *pX,        /*
347c0 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68   Payload with wh
347d0 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
347e0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
347f0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
34800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34810 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
34820 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
34830 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
34840 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
34850 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
34860 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
34870 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
34880 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
34890 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
348a0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
348b0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
348c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
348d0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
348e0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
348f0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
34900 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
34910 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65  nHeader;..  asse
34920 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
34930 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
34940 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
34950 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
34960 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
34970 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
34980 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
34990 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
349a0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
349b0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
349c0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
349d0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
349e0 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
349f0 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
34a00 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
34a10 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
34a20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
34a30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34a40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34a50 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
34a60 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
34a70 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  .  nHeader = pPa
34a80 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
34a90 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
34aa0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61  ntKey ){.    nPa
34ab0 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74  yload = pX->nDat
34ac0 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20  a + pX->nZero;. 
34ad0 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44     pSrc = pX->pD
34ae0 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
34af0 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61  pX->nData;.    a
34b00 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
34b10 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66  tKeyLeaf ); /* f
34b20 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
34b30 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76   called for leav
34b40 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65  es */.    nHeade
34b50 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
34b60 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
34b70 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
34b80 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
34b90 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
34ba0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70  ader], *(u64*)&p
34bb0 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  X->nKey);.  }els
34bc0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
34bd0 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66  X->nKey<=0x7ffff
34be0 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21  fff && pX->pKey!
34bf0 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d  =0 );.    nSrc =
34c00 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
34c10 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70  )pX->nKey;.    p
34c20 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a  Src = pX->pKey;.
34c30 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
34c40 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
34c50 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
34c60 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  load);.  }.  .  
34c70 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
34c80 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28 20  ayload */.  if( 
34c90 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
34ca0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
34cb0 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
34cc0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
34cd0 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
34ce0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
34cf0 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
34d00 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
34d10 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
34d20 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
34d30 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
34d40 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
34d50 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
34d60 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
34d70 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
34d80 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
34d90 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
34da0 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
34db0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
34dc0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
34dd0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
34de0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
34df0 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
34e00 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
34e10 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
34e20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
34e30 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
34e40 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
34e50 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
34e60 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
34e70 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
34e80 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
34e90 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
34ea0 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
34eb0 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
34ec0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
34ed0 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
34ee0 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
34ef0 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
34f00 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
34f10 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
34f20 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
34f30 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
34f40 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
34f50 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
34f60 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
34f70 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
34f80 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
34f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fa0 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
34fb0 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
34fc0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
34fd0 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
34fe0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
34ff0 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
35000 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
35010 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
35020 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
35030 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
35040 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
35050 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
35060 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
35070 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
35080 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
35090 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
350a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
350b0 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
350c0 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
350d0 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
350e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
350f0 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
35100 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
35110 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
35120 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
35130 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
35140 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74  t( nHeader==(int
35150 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
35160 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
35170 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
35180 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20  y==pX->nKey );. 
35190 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
351a0 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
351b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
351c0 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
351d0 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a  o.nLocal );.  }.
351e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
351f0 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
35200 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
35210 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
35220 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
35230 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
35240 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
35250 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
35260 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
35270 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
35280 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
35290 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
352a0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
352b0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
352c0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
352d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
352e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
352f0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
35300 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
35310 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
35320 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
35330 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
35340 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
35350 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
35360 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
35370 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
35380 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
35390 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
353a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
353b0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
353c0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
353d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
353e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
353f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
35400 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
35410 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
35420 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
35430 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
35440 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
35450 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
35460 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
35470 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
35480 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
35490 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
354a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
354b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
354c0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
354d0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
354e0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
354f0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
35500 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
35510 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
35520 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
35530 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
35540 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
35550 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
35560 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
35570 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
35580 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
35590 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
355a0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
355b0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
355c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
355d0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
355e0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
355f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
35600 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
35610 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
35620 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
35630 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
35640 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
35650 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
35660 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
35670 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
35680 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
35690 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
356a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
356b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
356c0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
356d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
356e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
356f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
35700 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
35710 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
35720 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35730 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
35740 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
35750 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
35760 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
35770 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
35780 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
35790 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
357a0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
357b0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
357c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
357d0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
357e0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
357f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
35800 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
35810 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
35820 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
35830 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
35840 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
35850 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
35860 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
35870 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
35880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
35890 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
358a0 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
358b0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
358c0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
358d0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
358e0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
358f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
35900 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
35910 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
35920 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
35930 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
35940 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
35950 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
35960 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
35970 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
35980 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
35990 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
359a0 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
359b0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
359c0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
359d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
359e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
359f0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
35a00 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
35a10 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
35a20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
35a30 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
35a40 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
35a50 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
35a60 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
35a70 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
35a80 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
35a90 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
35aa0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
35ab0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
35ac0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
35ad0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35ae0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
35af0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
35b00 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
35b10 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
35b20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
35b30 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
35b40 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
35b50 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
35b60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35b70 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
35b80 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
35b90 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
35ba0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
35bb0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
35bc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35bd0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35be0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
35bf0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
35c00 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
35c10 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
35c20 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
35c30 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
35c40 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
35c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
35c60 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
35c70 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
35c80 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
35c90 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
35ca0 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
35cb0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
35cc0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
35cd0 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = n;.  }.  relea
35ce0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
35cf0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
35d00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35d10 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
35d20 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
35d30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
35d40 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
35d50 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
35d60 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
35d70 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
35d80 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
35d90 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
35da0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
35db0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
35dc0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
35dd0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
35de0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
35df0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
35e00 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
35e10 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
35e20 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
35e30 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
35e40 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
35e50 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
35e60 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
35e70 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
35e80 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
35e90 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
35ea0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
35eb0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
35ec0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
35ed0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
35ee0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
35ef0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
35f00 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
35f10 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
35f20 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
35f30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
35f40 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
35f50 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
35f60 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
35f70 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
35f80 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
35f90 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
35fa0 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
35fb0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
35fc0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
35fd0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
35fe0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  l );.  assert( C
35ff0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d  ORRUPT_DB || sz=
36000 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
36010 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
36020 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
36030 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
36040 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
36050 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36060 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
36070 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
36080 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
36090 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
360a0 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
360b0 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
360c0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
360d0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
360e0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
360f0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
36100 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
36110 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
36120 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
36130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
36140 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
36150 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
36160 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
36170 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
36180 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
36190 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
361a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
361b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
361c0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
361d0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
361e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
361f0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
36200 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
36210 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
36220 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
36230 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
36240 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
36250 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
36260 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
36270 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
36280 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
36290 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
362a0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
362b0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
362c0 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
362d0 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
362e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362f0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
36300 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
36310 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
36320 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
36330 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
36340 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
36350 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
36360 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
36370 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
36380 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
36390 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
363a0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
363b0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
363c0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
363d0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
363e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
363f0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
36400 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
36410 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
36420 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
36430 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
36440 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
36450 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
36460 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
36470 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
36480 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
36490 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
364a0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
364b0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
364c0 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
364d0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
364e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
364f0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
36500 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
36510 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
36520 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
36530 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
36540 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
36550 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
36560 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
36570 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
36580 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
36590 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
365a0 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65  .** *pRC must be
365b0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
365c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
365d0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
365e0 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
365f0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
36600 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
36610 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
36620 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
36630 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
36640 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
36650 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
36660 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
36670 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
36680 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
36690 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
366a0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
366b0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
366c0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
366d0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
366e0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
366f0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
36700 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
36710 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
36720 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
36730 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
36740 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
36750 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
36760 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
36770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
36780 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
36790 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
367a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
367b0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
367c0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
367d0 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
367e0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
367f0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
36800 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
36810 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
36820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
36830 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
36840 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
36850 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
36860 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
36870 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
36880 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
36890 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73  nserted */..  as
368a0 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49  sert( *pRC==SQLI
368b0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
368c0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
368d0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
368e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
368f0 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
36900 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
36910 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
36920 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
36930 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
36940 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  t) || CORRUPT_DB
36950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
36960 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
36970 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
36980 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
36990 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
369a0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
369b0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
369c0 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
369d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
369e0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
369f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
36a00 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
36a10 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
36a20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
36a30 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
36a40 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
36a50 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
36a60 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
36a70 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
36a80 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
36a90 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
36aa0 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
36ab0 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
36ac0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
36ad0 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
36ae0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
36af0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
36b00 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
36b10 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
36b20 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
36b30 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
36b40 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
36b50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
36b60 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
36b70 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c   sz==pPage->xCel
36b80 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65  lSize(pPage, pCe
36b90 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
36ba0 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
36bb0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
36bc0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
36bd0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
36be0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
36bf0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
36c00 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
36c10 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
36c20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
36c30 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
36c40 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
36c50 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
36c60 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
36c70 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
36c80 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67  /* Comparison ag
36c90 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d  ainst ArraySize-
36ca0 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20  1 since we hold 
36cb0 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73  back one extra s
36cc0 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  lot.    ** as a 
36cd0 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e  contingency.  In
36ce0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65   other words, ne
36cf0 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68  ver need more th
36d00 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20  an 3 overflow.  
36d10 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34    ** slots but 4
36d20 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
36d30 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
36d40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36d50 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 50  j < ArraySize(pP
36d60 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29  age->apOvfl)-1 )
36d70 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
36d80 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
36d90 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
36da0 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a  l[j] = (u16)i;..
36db0 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74      /* When mult
36dc0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f  iple overflows o
36dd0 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61  ccur, they are a
36de0 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c  lways sequential
36df0 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73   and in.    ** s
36e00 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68  orted order.  Th
36e10 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72  is invariants ar
36e20 69 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74  ise because mult
36e30 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63  iple overflows c
36e40 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f  an.    ** only o
36e50 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74  ccur when insert
36e60 69 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ing divider cell
36e70 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
36e80 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20  t page during.  
36e90 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20    ** balancing, 
36ea0 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73  and the dividers
36eb0 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e   are adjacent an
36ec0 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f  d sorted..    */
36ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
36ee0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76  0 || pPage->aiOv
36ef0 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29  fl[j-1]<(u16)i )
36f00 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69  ; /* Overflows i
36f10 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
36f20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d  /.    assert( j=
36f30 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e  =0 || i==pPage->
36f40 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b  aiOvfl[j-1]+1 );
36f50 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20     /* Overflows 
36f60 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a  are sequential *
36f70 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
36f80 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
36f90 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
36fa0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
36fb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36fc0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
36fd0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
36fe0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
36ff0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
37000 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37010 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37020 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
37030 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->aData;.    ass
37040 65 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65  ert( &data[pPage
37050 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70  ->cellOffset]==p
37060 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29  Page->aCellIdx )
37070 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
37080 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
37090 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
370a0 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
370b0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
370c0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
370d0 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
370e0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
370f0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72  following proper
37100 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
37110 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
37120 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73  sfully */.    as
37130 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29  sert( idx >= 0 )
37140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
37150 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  x >= pPage->cell
37160 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
37170 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55  nCell+2 || CORRU
37180 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
37190 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
371a0 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
371b0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
371c0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
371d0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
371e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
371f0 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73  a[idx], pCell, s
37200 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  z);.    if( iChi
37210 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
37220 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
37230 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
37240 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65      pIns = pPage
37250 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32  ->aCellIdx + i*2
37260 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49  ;.    memmove(pI
37270 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70  ns+2, pIns, 2*(p
37280 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29  Page->nCell - i)
37290 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
372a0 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20  pIns, idx);.    
372b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
372c0 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74      /* increment
372d0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20   the cell count 
372e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61  */.    if( (++da
372f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
37300 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74  set+4])==0 ) dat
37310 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
37320 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73  et+3]++;.    ass
37330 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
37340 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
37350 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d  fset+3])==pPage-
37360 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65  >nCell );.#ifnde
37370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37380 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
37390 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
373a0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
373b0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
373c0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
373d0 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
373e0 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
373f0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
37400 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
37410 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
37420 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
37430 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
37440 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
37450 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
37460 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
37470 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
37480 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62  * A CellArray ob
37490 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
374a0 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72  cache of pointer
374b0 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20  s and sizes for 
374c0 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65  a.** consecutive
374d0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c   sequence of cel
374e0 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ls that might be
374f0 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c   held on multipl
37500 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
37510 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
37520 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
37530 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
37540 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37560 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
37570 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
37580 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
37590 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
375a0 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20  rence page */.  
375b0 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
375c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
375d0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
375e0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
375f0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
37600 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
37610 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
37620 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  pCell[] */.};../
37630 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
37640 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74  he cell sizes at
37650 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e   idx, idx+1, ...
37660 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62  , idx+N-1 have b
37670 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e  een.** computed.
37680 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
37690 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
376a0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
376b0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b  int idx, int N){
376c0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
376d0 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e  0 && idx+N<=p->n
376e0 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28  Cell );.  while(
376f0 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   N>0 ){.    asse
37700 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  rt( p->apCell[id
37710 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  x]!=0 );.    if(
37720 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
37730 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
37740 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e  zCell[idx] = p->
37750 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
37760 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
37770 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65  ll[idx]);.    }e
37780 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
37790 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
377a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
377b0 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70  ->szCell[idx]==p
377c0 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
377d0 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
377e0 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20  Cell[idx]) );.  
377f0 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20    }.    idx++;. 
37800 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     N--;.  }.}../
37810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
37820 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20  size of the Nth 
37830 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63  element of the c
37840 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61  ell array.*/.sta
37850 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
37860 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43  INE u16 computeC
37870 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61  ellSize(CellArra
37880 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  y *p, int N){.  
37890 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20  assert( N>=0 && 
378a0 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  N<p->nCell );.  
378b0 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c  assert( p->szCel
378c0 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  l[N]==0 );.  p->
378d0 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70  szCell[N] = p->p
378e0 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
378f0 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
37900 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[N]);.  return 
37910 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a  p->szCell[N];.}.
37920 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65  static u16 cache
37930 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  dCellSize(CellAr
37940 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
37950 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
37960 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
37970 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
37980 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73  N] ) return p->s
37990 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75  zCell[N];.  retu
379a0 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  rn computeCellSi
379b0 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ze(p, N);.}../*.
379c0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
379d0 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
379e0 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74  ers to nCell b-t
379f0 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20  ree page cells. 
37a00 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d  The .** szCell[]
37a10 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
37a20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
37a30 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20  s of each cell. 
37a40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
37a50 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75   replaces the cu
37a60 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
37a70 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20  f page pPg with 
37a80 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
37a90 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61  the cell.** arra
37aa0 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66  y..**.** Some of
37ab0 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70   the cells in ap
37ac0 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65  Cell[] may curre
37ad0 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ntly be stored i
37ae0 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66  n pPg. This.** f
37af0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72  unction works ar
37b00 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
37b10 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20  used by this by 
37b20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
37b30 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65   any .** such ce
37b40 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77  lls before overw
37b50 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
37b60 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  data..**.** The 
37b70 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69  MemPage.nFree fi
37b80 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74  eld is invalidat
37b90 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
37ba0 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ion. It is the .
37bb0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
37bc0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
37bd0 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
37be0 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
37bf0 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a  nt rebuildPage(.
37c00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
37c30 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  age */.  int nCe
37c40 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37c50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
37c60 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
37c70 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
37c80 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
37c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37ca0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
37cb0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
37cc0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
37cd0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37ce0 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
37cf0 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
37d00 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
37d10 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
37d20 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
37d30 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  r on pPg */.  u8
37d40 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
37d50 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
37d60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
37d70 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
37d80 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  g */.  const int
37d90 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
37da0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
37db0 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ze;.  u8 * const
37dc0 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75   pEnd = &aData[u
37dd0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e  sableSize];.  in
37de0 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  t i;.  u8 *pCell
37df0 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
37e00 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20  Idx;.  u8 *pTmp 
37e10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
37e20 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
37e30 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20  ->pPager);.  u8 
37e40 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67  *pData;..  i = g
37e50 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
37e60 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
37e70 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74  (&pTmp[i], &aDat
37e80 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  a[i], usableSize
37e90 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20   - i);..  pData 
37ea0 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d  = pEnd;.  for(i=
37eb0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
37ec0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
37ed0 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
37ee0 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48   if( SQLITE_WITH
37ef0 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70  IN(pCell,aData,p
37f00 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43  End) ){.      pC
37f10 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
37f20 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
37f30 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
37f40 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75  zCell[i];.    pu
37f50 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
37f60 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29   (pData - aData)
37f70 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
37f80 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44  += 2;.    if( pD
37f90 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29  ata < pCellptr )
37fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
37fb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
37fc0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
37fd0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
37fe0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
37ff0 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43  Cell[i]==pPg->xC
38000 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65  ellSize(pPg, pCe
38010 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
38020 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
38030 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50  e( szCell[i]!=pP
38040 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
38050 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a  ,pCell) );.  }..
38060 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46    /* The pPg->nF
38070 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77  ree field is now
38080 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
38090 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
380a0 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70  l fix it. */.  p
380b0 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  Pg->nCell = nCel
380c0 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66  l;.  pPg->nOverf
380d0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32  low = 0;..  put2
380e0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
380f0 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79  1], 0);.  put2by
38100 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
38110 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
38120 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
38130 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
38140 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61   aData);.  aData
38150 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a  [hdr+7] = 0x00;.
38160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38170 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  OK;.}../*.** Arr
38180 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
38190 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
381a0 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
381b0 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
381c0 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68  l.** contains th
381d0 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
381e0 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
381f0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
38200 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a   attempts to .**
38210 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73   add the cells s
38220 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72  tored in the arr
38230 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ay to page pPg. 
38240 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65  If it cannot (be
38250 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
38260 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64  ge needs to be d
38270 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f  efragmented befo
38280 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c  re the cells wil
38290 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f  l fit), non-zero
382a0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
382b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
382c0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64  he cells are add
382d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
382e0 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75   zero is.** retu
382f0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  rned..**.** Argu
38300 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f  ment pCellptr po
38310 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
38320 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
38330 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
38340 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61  y.** (part of pa
38350 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c  ge pPg) to popul
38360 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20  ate. After cell 
38370 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69  apCell[0] is wri
38380 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70  tten to the.** p
38390 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62  age body, a 16-b
383a0 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69  it offset is wri
383b0 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72  tten to pCellptr
383c0 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72  . And so on, for
383d0 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e   each.** cell in
383e0 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69   the array. It i
383f0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
38400 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
38410 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  er to ensure.** 
38420 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
38430 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69  to overwrite thi
38440 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65  s part of the ce
38450 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
38460 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
38470 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
38480 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f  lled, *ppData po
38490 69