/ Hex Artifact Content
Login

Artifact 03149b0f3fec3c1aa3c50a17e997bb442b867632:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66  dex key */..  if
6720: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
6730: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
6740: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
6750: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
6760: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
6770: 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d  ckedRecord(pCur-
6780: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
6790: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
67a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
67b0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
67c0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
67d0: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
67e0: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
67f0: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
6800: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
6810: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
6820: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6830: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6840: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6850: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6860: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6870: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6880: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6890: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
68a0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
68b0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
68c0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
68d0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
68e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
68f0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6900: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6910: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6920: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6930: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6940: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
6950: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
6960: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
6970: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
6980: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
6990: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
69a0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
69b0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
69c0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
69d0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
69e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
69f0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
6a00: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
6a10: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
6a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6a30: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6a40: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6a50: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
6a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6a70: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6a80: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6a90: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6aa0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6ac0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
6ad0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
6ae0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
6af0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6b00: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
6b10: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b20: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
6b30: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
6b40: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
6b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6b60: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
6b70: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
6b80: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
6b90: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
6ba0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
6bb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6bd0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6be0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6bf0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
6c00: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6c10: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
6c20: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c30: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
6c40: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
6c50: 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  |= skipNext;.   
6c60: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
6c70: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
6c80: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6c90: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
6ca0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cb0: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
6cc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6cd0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
6ce0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6cf0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
6d00: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6d10: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
6d20: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
6d30: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d40: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
6d50: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
6d60: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
6d70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6d80: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6d90: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6da0: 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73   where.** it was
6db0: 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72   last placed, or
6dc0: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69   has been invali
6dd0: 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74  dated for any ot
6de0: 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43  her reason..** C
6df0: 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20  ursors can move 
6e00: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
6e10: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  y are pointing a
6e20: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6e30: 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  .** from under t
6e40: 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  hem, for example
6e50: 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20  .  Cursor might 
6e60: 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62  also move if a b
6e70: 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c  tree.** is rebal
6e80: 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  anced..**.** Cal
6e90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6ea0: 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75  e with a NULL cu
6eb0: 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74  rsor pointer ret
6ec0: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  urns false..**.*
6ed0: 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61  * Use the separa
6ee0: 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  te sqlite3BtreeC
6ef0: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72  ursorRestore() r
6f00: 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72  outine to restor
6f10: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61  e a cursor.** ba
6f20: 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f  ck to where it o
6f30: 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68  ught to be if th
6f40: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6f50: 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  ns true..*/.int 
6f60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6f70: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
6f80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
6f90: 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
6fa0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e!=CURSOR_VALID;
6fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6fc0: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
6fd0: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
6fe0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
6ff0: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7000: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7010: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7020: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
7030: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
7040: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
7050: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
7060: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
7070: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
7080: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7090: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
70a0: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
70b0: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
70c0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
70d0: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
70e0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
70f0: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7100: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7110: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7120: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
7130: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
7140: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
7150: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
7160: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
7170: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
7180: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7190: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
71a0: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
71b0: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
71c0: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
71d0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
71e0: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
71f0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7200: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7210: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7220: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
7230: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
7240: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
7250: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
7260: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7270: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
7280: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7290: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
72a0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
72b0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
72c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
72d0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
72e0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
72f0: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7300: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7310: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7320: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
7330: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
7340: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
7350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7370: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7380: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7390: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
73a0: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
73b0: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
73c0: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
73d0: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
73e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
73f0: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7400: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7410: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7420: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7430: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7440: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7450: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7460: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7470: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7480: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7490: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
74a0: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
74b0: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
74c0: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
74d0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
74e0: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
74f0: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7500: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7510: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7520: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7530: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7540: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7550: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7560: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7570: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7580: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7590: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
75a0: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
75b0: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
75c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
75d0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
75e0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
75f0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7600: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7610: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7620: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7630: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7640: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7650: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7660: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7670: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7680: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7690: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
76a0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
76b0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
76c0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
76d0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
76e0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
76f0: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7700: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7710: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7720: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7730: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7740: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7750: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7760: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7770: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7780: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7790: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
77a0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
77b0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
77c0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
77d0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
77e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
77f0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7800: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7810: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7820: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7830: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7840: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7850: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7860: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7870: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7880: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7890: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
78a0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
78b0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
78c0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
78d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
78e0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
78f0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7900: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7910: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7920: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7930: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7940: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7950: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7960: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7970: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7980: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
7990: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
79a0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
79b0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
79c0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
79d0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
79e0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
79f0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7a00: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7a10: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7a20: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7a30: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7a40: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7a50: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7a60: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7a70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7a80: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
7a90: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
7aa0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7ab0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
7ac0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
7ad0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7ae0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7af0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7b00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7b10: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7b20: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7b30: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7b40: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7b50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b60: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b70: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7b80: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
7b90: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
7ba0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
7bb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7bc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
7bd0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7be0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7bf0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7c00: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7c10: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7c20: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7c30: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c60: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7c70: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7c80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7c90: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7ca0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7cb0: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
7cc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7cd0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7ce0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7cf0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7d00: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7d10: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7d20: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7d30: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7d40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7d50: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7d60: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7d70: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7d80: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7d90: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7da0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7db0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7dc0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7dd0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7de0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7df0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7e00: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7e10: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7e20: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7e30: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7e40: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7e50: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7e60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7e70: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7e80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7e90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7ea0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7eb0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7ec0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7ed0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
7ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
7ef0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
7f00: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7f10: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7f20: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7f30: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7f40: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7f50: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7f80: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7f90: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7fa0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7fb0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7fc0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7fd0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
7fe0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
7ff0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8000: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8010: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8030: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
8040: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8050: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
8060: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
8070: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8080: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8090: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
80a0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
80b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
80c0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
80d0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
80e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
80f0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8100: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8110: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8120: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
8130: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
8140: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
8150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8160: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8170: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8180: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8190: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
81a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
81b0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
81c0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
81d0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
81e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
81f0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8200: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8210: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8220: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
8230: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
8240: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
8250: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8270: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8280: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
82a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
82b0: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
82c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
82d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
82e0: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
82f0: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8300: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8310: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8320: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8330: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
8340: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
8350: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
8360: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
8370: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
8380: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8390: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
83a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
83b0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
83c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
83d0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
83e0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
83f0: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8400: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8410: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8420: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
8430: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
8440: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
8450: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
8460: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
8470: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
8480: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8490: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
84a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
84b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
84c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
84d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
84e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
84f0: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8500: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8510: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8520: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
8530: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
8540: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
8550: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
8560: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
8570: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
8580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8590: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
85a0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
85b0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
85c0: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
85d0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
85e0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
85f0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8600: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8610: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8620: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
8630: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
8640: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
8650: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
8660: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8670: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8680: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8690: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
86a0: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
86b0: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
86c0: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
86d0: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
86e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
86f0: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8700: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8710: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8720: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
8730: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
8740: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
8750: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
8760: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
8770: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
8780: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8790: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
87a0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
87b0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
87c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
87d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
87e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8800: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8810: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8820: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8830: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8840: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8850: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8860: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8870: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
8880: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
8890: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
88a0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
88b0: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
88c0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
88d0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
88e0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
88f0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8900: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8910: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8920: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8930: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8940: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8950: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8960: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8970: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8980: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8990: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
89a0: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
89b0: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
89c0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
89d0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
89e0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
89f0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8a00: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8a10: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8a20: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8a30: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8a40: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8a50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8a60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8a70: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8a80: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8a90: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8aa0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ab0: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8ac0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8ad0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8ae0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8af0: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8b00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8b10: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8b20: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8b30: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8b40: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8b50: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8b60: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8b70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8b80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8b90: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8ba0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8bb0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8bc0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8bd0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8be0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8bf0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8c00: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8c10: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8c20: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8c30: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8c40: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8c50: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8c60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8c70: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8c90: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8ca0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8cb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8cc0: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8cd0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8ce0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8cf0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8d00: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8d10: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8d30: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8d40: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8d50: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8d60: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8d70: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8d80: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8d90: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8da0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8db0: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8dc0: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8dd0: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8de0: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8df0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8e00: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8e10: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8e20: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8e30: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8e40: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8e50: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8e60: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8e70: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e80: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
8e90: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8ea0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8eb0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8ec0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8ed0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8ee0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8ef0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8f00: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8f10: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8f20: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8f30: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8f40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8f60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8f80: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
8f90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8fa0: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
8fb0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
8fc0: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
8fd0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
8fe0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
8ff0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9000: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9010: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9020: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
9030: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
9040: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9050: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
9060: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
9070: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
9080: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9090: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
90a0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
90b0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
90c0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
90d0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
90e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
90f0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9100: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9110: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9120: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9130: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9140: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9160: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9170: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9180: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9190: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
91a0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
91b0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
91c0: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
91e0: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
91f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9200: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9210: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9220: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9230: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9240: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9260: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
9270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9280: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
9290: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
92a0: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
92b0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
92c0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
92d0: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
92e0: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
92f0: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9300: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9310: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9320: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9330: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
9340: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
9350: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
9360: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
9370: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9380: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9390: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
93a0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
93b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
93c0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
93d0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
93e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
93f0: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9400: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9410: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9420: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
9430: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
9440: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
9450: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
9460: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
9470: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
9480: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
9490: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
94a0: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
94b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
94c0: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
94d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
94e0: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
94f0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9500: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9510: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9520: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
9530: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
9540: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9550: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
9560: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
9580: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
9590: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95a0: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
95b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
95c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95d0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
95e0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
95f0: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9600: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9610: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9620: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9630: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9640: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9650: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9660: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9670: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9680: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9690: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
96a0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
96b0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
96c0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
96d0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
96e0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
96f0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9700: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9710: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9720: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9730: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9740: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9750: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9760: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9770: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9780: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9790: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
97a0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
97b0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
97c0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
97d0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
97e0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
97f0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9800: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9810: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9820: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9830: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9840: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9850: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9860: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9870: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9880: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9890: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
98a0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
98b0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
98c0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
98d0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
98e0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
98f0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9900: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9910: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9920: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9930: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9940: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9960: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9970: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9980: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9990: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
99a0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
99b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
99c0: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
99d0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
99e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
99f0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9a00: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9a10: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9a20: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9a30: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9a40: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9a50: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9a60: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9a70: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9a80: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9a90: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9aa0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9ab0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9ac0: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9ad0: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9ae0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9af0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b00: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9b10: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9b20: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9b30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9b40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9b50: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9b60: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9b70: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9b80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9c10: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9c20: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9c30: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9c40: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9c50: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9c60: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9c80: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9ca0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9cb0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9cc0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9cd0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9ce0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9cf0: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9d00: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9d10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9d20: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9d30: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d50: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9d60: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9d70: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9d80: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9d90: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9da0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9db0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9dc0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9dd0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9de0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9df0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9e00: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9e10: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9e20: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9e30: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9e40: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9e50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9e60: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9e70: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9e80: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
9e90: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
9ea0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
9eb0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
9ec0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9ed0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
9ee0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9ef0: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9f00: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9f10: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9f20: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9f40: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9f50: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9f60: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9f70: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9f80: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
9f90: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
9fa0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
9fb0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
9fc0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
9fd0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9fe0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9ff0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a000: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a010: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a020: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a030: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a040: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a070: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a080: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a0b0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a0c0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a0d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a0e0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a0f0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a100: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a110: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a120: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a130: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a140: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a150: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a160: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a170: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a180: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a190: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a1a0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a1c0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a1d0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a1e0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a1f0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a200: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a210: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a220: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a230: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a240: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a250: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a260: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a270: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a280: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a290: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a2a0: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a2b0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a2c0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a2d0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a2e0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a2f0: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a310: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a320: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a330: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a340: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a350: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a360: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a380: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a390: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a3a0: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a3b0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a3c0: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a3d0: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a3e0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a3f0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a400: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a410: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a420: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a430: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a440: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a450: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a460: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a470: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a480: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a490: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a4a0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a4b0: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a4c0: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a4d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a4e0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a4f0: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a500: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a510: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a520: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a530: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a540: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a550: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a560: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a570: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a580: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a590: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a5a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a5b0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a5c0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a5d0: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a5e0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a5f0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a600: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a610: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a620: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a630: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a640: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a650: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a660: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a670: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a680: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a690: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a6a0: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a6b0: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a6c0: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a6d0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a6e0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a6f0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a700: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a710: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a720: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a730: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a740: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a750: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a760: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a770: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a780: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a790: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a7a0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a7b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a7c0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a7d0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a7e0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a7f0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a800: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a810: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a820: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a830: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a840: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a850: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a860: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a870: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a880: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
a890: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a8a0: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
a8b0: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
a8c0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a8d0: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a8e0: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
a8f0: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
a900: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
a910: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
a920: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a930: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
a940: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
a950: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a960: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
a970: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
a980: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
a990: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
a9a0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
a9b0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
a9c0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
a9d0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
a9e0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
a9f0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
aa00: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
aa10: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
aa20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
aa30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
aa40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
aa50: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
aa60: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
aa70: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
aa80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
aa90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
aaa0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
aab0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
aac0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
aad0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
aae0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
aaf0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ab00: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ab10: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ab20: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
ab30: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
ab40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
ab50: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
ab60: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ab70: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
ab80: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
ab90: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
aba0: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
abb0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
abc0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
abd0: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
abe0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
abf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ac00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ac10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ac20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ac30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
ac40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
ac50: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
ac60: 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73  eorganizes cells
ac70: 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70   within the.** p
ac80: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
ac90: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c  e are no free-bl
aca0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ocks on the free
acb0: 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a  -block list..**.
acc0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61  ** Parameter nMa
acd0: 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78  xFrag is the max
ace0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66  imum amount of f
acf0: 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
ad00: 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70  that may be.** p
ad10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61  resent in the pa
ad20: 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ge after this ro
ad30: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
ad40: 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46  *.** EVIDENCE-OF
ad50: 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20  : R-44582-60138 
ad60: 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20  SQLite may from 
ad70: 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f  time to time reo
ad80: 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74  rganize a.** b-t
ad90: 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74  ree page so that
ada0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
adb0: 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67  eeblocks or frag
adc0: 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a  ment bytes, all.
add0: 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  ** unused bytes 
ade0: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
adf0: 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64   the unallocated
ae00: 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61   space region, a
ae10: 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  nd all.** cells 
ae20: 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74  are packed tight
ae30: 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ly at the end of
ae40: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
ae50: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
ae60: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
ae70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78  *pPage, int nMax
ae80: 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Frag){.  int i; 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aeb0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
aee0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
aef0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
af20: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
af30: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af50: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
af60: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
af70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
af80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
af90: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
afa0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
afb0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
afc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
afd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
afe0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aff0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
b000: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b010: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
b020: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
b030: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
b040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b050: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
b060: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
b070: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
b080: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
b090: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
b0a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
b0b0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
b0c0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
b0d0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
b0e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
b0f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
b100: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b110: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b130: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b140: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b150: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b170: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b180: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73   index */..  ass
b190: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b1a0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
b1b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b1c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1d0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b1e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
b1f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
b200: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
b210: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
b220: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b230: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
b240: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b250: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b260: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
b270: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
b280: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
b290: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
b2a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b2b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
b2c0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
b2d0: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
b2e0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
b2f0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
b300: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
b310: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
b320: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b330: 2a 6e 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68  *nCell;..  /* Th
b340: 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
b350: 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20   pages with two 
b360: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c  or fewer free bl
b370: 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61  ocks and nMaxFra
b380: 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20  g.  ** or fewer 
b390: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
b3a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
b3b0: 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d  t is faster to m
b3c0: 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  ove the.  ** two
b3d0: 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73   (or one) blocks
b3e0: 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20   of cells using 
b3f0: 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64  memmove() and ad
b400: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20  d the required. 
b410: 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65   ** offsets to e
b420: 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ach pointer in t
b430: 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
b440: 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73  array than it is
b450: 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73   to .  ** recons
b460: 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65  truct the entire
b470: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28   page.  */.  if(
b480: 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37   (int)data[hdr+7
b490: 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20  ]<=nMaxFrag ){. 
b4a0: 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67     int iFree = g
b4b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b4c0: 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  r+1]);.    if( i
b4d0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Free ){.      in
b4e0: 74 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62  t iFree2 = get2b
b4f0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d  yte(&data[iFree]
b500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
b510: 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b  iFree2 || (data[
b520: 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61  iFree2]==0 && da
b530: 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29  ta[iFree2+1]==0)
b540: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
b550: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
b560: 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
b570: 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  2];.        u8 *
b580: 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69  pAddr;.        i
b590: 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20  nt sz2 = 0;.    
b5a0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74      int sz = get
b5b0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b5c0: 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e+2]);.        i
b5d0: 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  nt top = get2byt
b5e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b5f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
b600: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
b610: 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28   sz2 = get2byte(
b620: 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29  &data[iFree2+2])
b630: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
b640: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
b650: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
b660: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
b670: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
b680: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
b690: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
b6a0: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
b6b0: 73 7a 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d  sz;.        memm
b6c0: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
b6d0: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
b6e0: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
b6f0: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
b700: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
b710: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
b720: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
b730: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
b740: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
b750: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
b760: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
b770: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
b780: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
b790: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
b7a0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
b7b0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
b7c0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
b7d0: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
b7e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b7f0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
b800: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b810: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  ize;.  cbrk = us
b820: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
b830: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
b840: 7a 65 20 2d 20 34 3b 0a 0a 20 20 66 6f 72 28 69  ze - 4;..  for(i
b850: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
b860: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
b870: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
b880: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
b890: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
b8a0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
b8b0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
b8c0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
b8d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b8e0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b8f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b900: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
b910: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
b920: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
b930: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
b940: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
b950: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
b960: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
b970: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
b980: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
b990: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
b9a0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
b9b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b9c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b9d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
b9e0: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
b9f0: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
ba00: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
ba10: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
ba20: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
ba30: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
ba40: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
ba50: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
ba60: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
ba70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ba80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ba90: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
baa0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
bab0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
bac0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
bad0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
bae0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
baf0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
bb00: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
bb10: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
bb20: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
bb30: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
bb40: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
bb50: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
bb60: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
bb70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
bb80: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
bb90: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
bba0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
bbb0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
bbc0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
bbd0: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
bbe0: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
bbf0: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
bc00: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
bc10: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
bc20: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
bc30: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
bc40: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
bc50: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
bc60: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
bc70: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
bc80: 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  7]+cbrk-iCellFir
bc90: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
bca0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
bcb0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bcc0: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
bcd0: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
bce0: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
bcf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
bd00: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
bd10: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
bd20: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+2] = 0;.  me
bd30: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
bd40: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
bd50: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
bd60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bd70: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bd80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bd90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
bda0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
bdb0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
bdc0: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
bdd0: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
bde0: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
bdf0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
be00: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
be10: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
be20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
be30: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
be40: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
be50: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
be60: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
be70: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
be80: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
be90: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
bea0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
beb0: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
bec0: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
bed0: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
bee0: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
bef0: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
bf00: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
bf10: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
bf20: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
bf30: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
bf40: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
bf50: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
bf60: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
bf70: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
bf80: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
bf90: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
bfa0: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
bfb0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
bfc0: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
bfd0: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
bfe0: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
bff0: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
c000: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
c010: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
c020: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
c030: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
c040: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
c050: 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  set;.  u8 * cons
c060: 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
c070: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64  Data;.  int iAdd
c080: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
c090: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
c0a0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
c0b0: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20  .  int x;.  int 
c0c0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
c0d0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c0e0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63  e;..  assert( pc
c0f0: 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  >0 );.  do{.    
c100: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
c110: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c120: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
c130: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
c140: 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31  -OF: R-06866-391
c150: 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72  25 Freeblocks ar
c160: 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74  e always connect
c170: 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20  ed in order of. 
c180: 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67     ** increasing
c190: 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20   offset. */.    
c1a0: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
c1b0: 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b  e-4 || pc<iAddr+
c1c0: 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  4 ){.      *pRc 
c1d0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
c1e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
c1f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
c200: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c210: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
c220: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
c230: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
c240: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
c250: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
c260: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
c270: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
c280: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
c290: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
c2a0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
c2b0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
c2c0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
c2d0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
c2e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
c2f0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
c300: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
c310: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
c320: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
c330: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  3 );.      if( p
c340: 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66  c < pPg->cellOff
c350: 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c  set+2*pPg->nCell
c360: 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73   || size+pc > us
c370: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c380: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
c390: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c3a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c3b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c3c0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
c3d0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c3e0: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
c3f0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
c400: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
c410: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
c420: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
c430: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
c440: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
c450: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
c460: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
c470: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
c480: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
c490: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
c4a0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
c4b0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
c4c0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
c4d0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
c4e0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
c4f0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
c500: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
c510: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
c520: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
c530: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
c540: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c550: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
c560: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
c570: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
c580: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
c590: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
c5a0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
c5b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
c5c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
c5d0: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
c5e0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
c5f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c600: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
c610: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
c620: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
c630: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c640: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d  &aData[pc]);.  }
c650: 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20  while( pc );..  
c660: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c670: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
c680: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
c690: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
c6a0: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
c6b0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
c6c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
c6d0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
c6e0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
c6f0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
c700: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
c710: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
c720: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
c730: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
c740: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
c750: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
c760: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
c770: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
c780: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
c790: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
c7a0: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
c7b0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
c7c0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c7d0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
c7e0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
c7f0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
c800: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
c810: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
c820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c830: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
c840: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
c850: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
c860: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
c870: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
c880: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
c890: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
c8a0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
c8b0: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
c8c0: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
c8d0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
c8e0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
c8f0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
c900: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
c910: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
c920: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
c930: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
c940: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
c950: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
c960: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
c970: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
c980: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
c990: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
c9a0: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
c9b0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
c9c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
c9d0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
ca00: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
ca10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
ca20: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ca30: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
ca40: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
ca50: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ca60: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
ca70: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
ca80: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
ca90: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
caa0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
cab0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
cac0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
cad0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
cae0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
caf0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
cb00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cb10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
cb20: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
cb30: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
cb40: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
cb50: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
cb60: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
cb70: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
cb80: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
cb90: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cba0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
cbb0: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
cbc0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cbd0: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
cbe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
cbf0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
cc00: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
cc10: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
cc20: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
cc30: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
cc40: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
cc50: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
cc60: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
cc70: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
cc80: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
cc90: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
cca0: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
ccb0: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
ccc0: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
ccd0: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
cce0: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
ccf0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
cd00: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
cd10: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
cd20: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
cd30: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
cd40: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
cd50: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
cd60: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
cd70: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
cd80: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
cd90: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
cda0: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
cdb0: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
cdc0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
cdd0: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
cde0: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
cdf0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ce00: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
ce10: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
ce20: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
ce30: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
ce40: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
ce50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ce60: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
ce70: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
ce80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ce90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cea0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
ceb0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
cec0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
ced0: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61  space between ga
cee0: 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e  p and top for on
cef0: 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e  e more cell poin
cf00: 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65  ter.  ** array e
cf10: 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64  ntry offset, and
cf20: 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   if the freelist
cf30: 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74   is not empty, t
cf40: 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20  hen search the. 
cf50: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f   ** freelist loo
cf60: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
cf70: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
cf80: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72  to satisfy the r
cf90: 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74  equest..  */.  t
cfa0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
cfb0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
cfc0: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
cfd0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
cfe0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28  ==top );.  if( (
cff0: 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64  data[hdr+2] || d
d000: 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67  ata[hdr+1]) && g
d010: 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20  ap+2<=top ){.   
d020: 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61   u8 *pSpace = pa
d030: 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65  geFindSlot(pPage
d040: 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20  , nByte, &rc);. 
d050: 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b     if( pSpace ){
d060: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d070: 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28  Space>=data && (
d080: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36  pSpace - data)<6
d090: 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70  5536 );.      *p
d0a0: 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61  Idx = (int)(pSpa
d0b0: 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20  ce - data);.    
d0c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d0d0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
d0e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
d0f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
d100: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
d110: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
d120: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
d130: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
d140: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
d150: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
d160: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
d170: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
d180: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
d190: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
d1a0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
d1b0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
d1c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
d1d0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
d1e0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
d1f0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20  mentPage(pPage, 
d200: 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46  MIN(4, pPage->nF
d210: 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29  ree - (2+nByte))
d220: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
d230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
d240: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
d250: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
d260: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
d270: 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70  gap+2+nByte<=top
d280: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
d290: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
d2a0: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
d2b0: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
d2c0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
d2d0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
d2e0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
d2f0: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
d300: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
d310: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
d320: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
d330: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
d340: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
d350: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
d360: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
d370: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
d380: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
d390: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
d3a0: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
d3b0: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
d3c0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
d3d0: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
d3e0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
d3f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
d400: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
d410: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
d420: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
d430: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
d440: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
d450: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d460: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d470: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
d480: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
d490: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
d4a0: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
d4b0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
d4c0: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
d4d0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
d4e0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
d4f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
d500: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
d510: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
d520: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
d530: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
d540: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
d550: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
d560: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
d570: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
d580: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
d590: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
d5a0: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
d5b0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
d5c0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
d5d0: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
d5e0: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
d5f0: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
d600: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
d610: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
d620: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
d630: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
d640: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
d650: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
d660: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
d670: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
d680: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d690: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
d6a0: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
d6b0: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
d6c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d6d0: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
d6e0: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
d6f0: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d720: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
d730: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
d740: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d770: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
d780: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7b0: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
d7c0: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
d7d0: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
d800: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
d810: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
d820: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
d830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d840: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
d850: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
d860: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
d870: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d880: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
d890: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
d8a0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
d8b0: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
d8c0: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
d8d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d8e0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
d8f0: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
d900: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d910: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
d920: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
d930: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
d940: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d950: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d960: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
d970: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
d980: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
d990: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
d9a0: 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  || iStart>=pPage
d9b0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
d9c0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
d9d0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  e );.  assert( C
d9e0: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e  ORRUPT_DB || iEn
d9f0: 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  d <= pPage->pBt-
da00: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
da10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
da20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
da30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
da40: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a  ;.  assert( iSiz
da50: 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=4 );   /* Min
da60: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
da70: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
da80: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
da90: 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  ;..  /* Overwrit
daa0: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
dab0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
dac0: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
dad0: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74  _delete.  ** opt
dae0: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
daf0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  /.  if( pPage->p
db00: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
db10: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
db20: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
db30: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
db40: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20   iSize);.  }..  
db50: 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66  /* The list of f
db60: 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  reeblocks must b
db70: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
db80: 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20  rder.  Find the 
db90: 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68  .  ** spot on th
dba0: 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74  e list where iSt
dbb0: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  art should be in
dbc0: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68  serted..  */.  h
dbd0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
dbe0: 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20  ffset;.  iPtr = 
dbf0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64  hdr + 1;.  if( d
dc00: 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26  ata[iPtr+1]==0 &
dc10: 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20  & data[iPtr]==0 
dc20: 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20  ){.    iFreeBlk 
dc30: 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75  = 0;  /* Shortcu
dc40: 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  t for the case w
dc50: 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74  hen the freelist
dc60: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d   is empty */.  }
dc70: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
dc80: 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74   (iFreeBlk = get
dc90: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
dca0: 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20  ]))<iStart ){.  
dcb0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
dcc0: 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20  <iPtr+4 ){.     
dcd0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d     if( iFreeBlk=
dce0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dd00: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
dd20: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
dd30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
dd40: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
dd50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dd60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
dd70: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
dd80: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
dd90: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
dda0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
ddb0: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
ddc0: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
ddd0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
dde0: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
ddf0: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
de00: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
de10: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
de20: 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20  r to iFreeBlk.  
de30: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63    **.    ** Chec
de40: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65  k to see if iFre
de50: 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63  eBlk should be c
de60: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
de70: 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e  e end of iStart.
de80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
de90: 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64  iFreeBlk && iEnd
dea0: 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a  +3>=iFreeBlk ){.
deb0: 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46        nFrag = iF
dec0: 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20  reeBlk - iEnd;. 
ded0: 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46       if( iEnd>iF
dee0: 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20  reeBlk ) return 
def0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
df00: 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  KPT;.      iEnd 
df10: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
df20: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
df30: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
df40: 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65  if( iEnd > pPage
df50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
df60: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
df70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
df80: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
df90: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
dfa0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
dfb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
dfc0: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
dfd0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
dfe0: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
dff0: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
e000: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
e010: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
e020: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
e030: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
e040: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
e050: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
e060: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
e070: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
e080: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
e090: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
e0a0: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
e0b0: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
e0c0: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
e0d0: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
e0e0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
e0f0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
e100: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
e110: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
e120: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
e130: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  KPT;.        nFr
e140: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
e150: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
e160: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
e170: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
e180: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
e190: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e1a0: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
e1b0: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
e1c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e1d0: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
e1e0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
e1f0: 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65    if( iStart==ge
e200: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e210: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  +5]) ){.    /* T
e220: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
e230: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
e240: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
e250: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
e260: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
e270: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
e280: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
e290: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
e2a0: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
e2b0: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
e2c0: 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72     if( iPtr!=hdr
e2d0: 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +1 ) return SQLI
e2e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
e2f0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e300: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
e310: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
e320: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e330: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
e340: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
e350: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
e360: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
e370: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
e380: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
e390: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75   iStart);.    pu
e3a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
e3b0: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
e3c0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e3d0: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
e3e0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Size);.  }.  pPa
e3f0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
e400: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
e410: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e420: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
e430: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
e440: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
e450: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
e460: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
e470: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
e480: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
e490: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
e4a0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
e4b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
e4c0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
e4d0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
e4e0: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
e4f0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
e500: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
e510: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
e520: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
e530: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
e540: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
e550: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
e560: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
e570: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
e580: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
e590: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
e5a0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
e5b0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
e5c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
e5d0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
e5e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
e5f0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
e600: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
e610: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e620: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
e630: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
e640: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
e650: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e660: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e670: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e680: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
e690: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
e6a0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
e6b0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
e6c0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
e6d0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
e6e0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
e6f0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
e700: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
e710: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
e720: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
e730: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
e740: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
e750: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
e760: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) ){.    /* EVID
e770: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31  ENCE-OF: R-07291
e780: 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f  -35328 A value o
e790: 66 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73  f 5 (0x05) means
e7a0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a   the page is an.
e7b0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20      ** interior 
e7c0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
e7d0: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
e7e0: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
e7f0: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
e800: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
e810: 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39  E-OF: R-26900-09
e820: 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  176 A value of 1
e830: 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74  3 (0x0d) means t
e840: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
e850: 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62   ** leaf table b
e860: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
e870: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
e880: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
e890: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  KEY|PTF_LEAF)==1
e8a0: 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  3 );.    pPage->
e8b0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
e8c0: 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
e8d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  ){.      pPage->
e8e0: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a  intKeyLeaf = 1;.
e8f0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
e900: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e910: 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20  arseCellPtr;.   
e920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
e930: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e940: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
e950: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
e960: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
e970: 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  ad;.      pPage-
e980: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
e990: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
e9a0: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a  oPayload;.    }.
e9b0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
e9c0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
e9d0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
e9e0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
e9f0: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
ea00: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
ea10: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
ea20: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ea30: 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20  : R-43316-37308 
ea40: 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78  A value of 2 (0x
ea50: 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  02) means the pa
ea60: 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
ea70: 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62  interior index b
ea80: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
ea90: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
eaa0: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
eab0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
eac0: 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32  OF: R-59615-4282
ead0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  8 A value of 10 
eae0: 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65  (0x0a) means the
eaf0: 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a   page is a.    *
eb00: 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74  * leaf index b-t
eb10: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
eb20: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
eb30: 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  RODATA|PTF_LEAF)
eb40: 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67  ==10 );.    pPag
eb50: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
eb60: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
eb70: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  Leaf = 0;.    pP
eb80: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
eb90: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
eba0: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
ebb0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ebc0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
ebd0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
ebe0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
ebf0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
ec00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ec10: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
ec20: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
ec30: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
ec40: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
ec50: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
ec60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ec70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ec80: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
ec90: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
eca0: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
ecb0: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
ecc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ecd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ece0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
ecf0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
ed00: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
ed10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
ed20: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
ed30: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
ed40: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
ed50: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
ed60: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
ed70: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
ed80: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
ed90: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
eda0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
edb0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
edc0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
edd0: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
ede0: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
edf0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
ee00: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
ee10: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
ee20: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
ee30: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
ee40: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
ee50: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
ee60: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
ee70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ee80: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
ee90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
eea0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
eeb0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
eec0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
eed0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
eee0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
eef0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
ef00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ef10: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
ef20: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
ef30: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
ef40: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
ef50: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
ef60: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
ef70: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
ef80: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
ef90: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63  it ){.    int pc
efa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
efb0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
efc0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
efd0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
efe0: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
eff0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f000: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
f010: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
f020: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
f030: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
f040: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
f050: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
f060: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
f070: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
f080: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
f090: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
f0a0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
f0b0: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
f0c0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
f0d0: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
f0e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
f0f0: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
f100: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
f110: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
f120: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
f130: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
f140: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
f150: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
f160: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f170: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
f180: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
f190: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
f1a0: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
f1b0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
f1c0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
f1d0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
f1e0: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
f1f0: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
f200: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
f210: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
f220: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
f230: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
f240: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
f250: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
f260: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f270: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f280: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
f290: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
f2a0: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
f2b0: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
f2c0: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
f2d0: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
f2e0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
f2f0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
f300: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
f310: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
f330: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
f340: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
f350: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
f360: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
f370: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
f380: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
f390: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
f3a0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
f3b0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
f3c0: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
f3d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
f3e0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
f3f0: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
f400: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
f410: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
f420: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
f430: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
f440: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
f450: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
f460: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
f470: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
f480: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
f490: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f4a0: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
f4b0: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
f4c0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
f4d0: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
f4e0: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
f4f0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
f500: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
f510: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
f520: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
f530: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
f540: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
f550: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
f560: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
f570: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f580: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
f590: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
f5a0: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f5b0: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
f5c0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
f5d0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
f5e0: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
f5f0: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
f600: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
f610: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
f620: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
f630: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
f640: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
f650: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
f660: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
f670: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
f680: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f690: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f6a0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
f6b0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
f6c0: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
f6d0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f6e0: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
f6f0: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
f700: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
f710: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
f720: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
f730: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
f740: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
f750: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
f760: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
f770: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
f780: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f790: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
f7a0: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
f7b0: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
f7c0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
f7d0: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
f7e0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
f7f0: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
f800: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
f810: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
f820: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
f830: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
f840: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
f850: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
f860: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
f870: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
f880: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f890: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f8a0: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f8b0: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f8c0: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f8d0: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f8e0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f8f0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f900: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f910: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f920: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f930: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f940: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f950: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f960: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f970: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f980: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f990: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f9a0: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f9b0: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f9c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f9d0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f9e0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f9f0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
fa00: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
fa10: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
fa20: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
fa30: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
fa40: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
fa50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
fa60: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
fa70: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
fa80: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
fa90: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
faa0: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
fab0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
fac0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
fad0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
fae0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
faf0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
fb00: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
fb10: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
fb20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fb30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fb40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fb50: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
fb60: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
fb70: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
fb80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
fb90: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
fba0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
fbb0: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
fbc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fbd0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fbe0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
fbf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
fc00: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
fc10: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
fc20: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
fc30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
fc40: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
fc50: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
fc60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fc70: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
fc80: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
fc90: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
fca0: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
fcb0: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
fcc0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
fcd0: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
fce0: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
fcf0: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
fd00: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
fd10: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
fd20: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
fd30: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
fd40: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
fd50: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
fd60: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
fd70: 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ace */.    if( p
fd80: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  c>0 ){.      u32
fd90: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
fda0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
fdb0: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  irst ){.        
fdc0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
fdd0: 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e  R-55530-52930 In
fde0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
fdf0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72  -tree page, ther
fe00: 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e will.        *
fe10: 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
fe20: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
fe30: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
fe40: 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
fe50: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
fe60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fe70: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
fe80: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 31  }.      while( 1
fe90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fea0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
feb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
fec0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fed0: 42 4b 50 54 3b 20 2f 2a 20 46 72 65 65 62 6c 6f  BKPT; /* Freeblo
fee0: 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ck off the end o
fef0: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
ff00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ff10: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
ff20: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
ff30: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
ff40: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
ff50: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 65 65 20  ;.        nFree 
ff60: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
ff70: 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 78 74          if( next
ff80: 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72  <=pc+size+3 ) br
ff90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 63 20  eak;.        pc 
ffa0: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  = next;.      }.
ffb0: 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30        if( next>0
ffc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ffd0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ffe0: 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 46 72 65 65  T_BKPT;  /* Free
fff0: 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63  block not in asc
10000 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
10010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10020 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67  ( pc+size>(unsig
10030 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69  ned int)usableSi
10040 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ze ){.        re
10050 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10060 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 4c 61  UPT_BKPT;  /* La
10070 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74  st freeblock ext
10080 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20 65  ends past page e
10090 6e 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  nd */.      }.  
100a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
100b0 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
100c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
100d0 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
100e0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20  to the start.   
100f0 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
10100 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
10110 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10120 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
10130 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c  n.    ** the cel
10140 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
10150 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
10160 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
10170 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f  le-size.    ** o
10180 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
10190 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
101a0 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
101b0 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20  s check also.   
101c0 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
101d0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
101e0 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
101f0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
10200 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65  ntent.    ** are
10210 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
10220 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
10230 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
10240 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
10250 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
10260 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
10270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10280 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
10290 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
102a0 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
102b0 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
102c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
102d0 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
102e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
102f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
10300 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
10310 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
10320 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
10330 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
10340 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
10350 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
10360 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10370 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
10380 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
10390 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
103a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
103b0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
103c0 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
103d0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
103e0 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
103f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10400 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
10410 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
10420 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
10430 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10440 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
10450 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
10460 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
10470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10480 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
10490 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
104a0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
104b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
104c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
104d0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
104e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
104f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10500 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
10510 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
10520 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
10530 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
10540 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
10550 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
10560 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
10570 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
10580 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
10590 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
105a0 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
105b0 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
105c0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
105d0 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
105e0 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
105f0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
10600 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
10610 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10620 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
10630 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
10640 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
10650 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
10660 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
10670 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
10680 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
10690 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
106a0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
106b0 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
106c0 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
106d0 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
106e0 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
106f0 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
10700 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
10710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10720 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
10730 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
10740 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
10750 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
10760 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
10770 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
10780 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
10790 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
107a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
107b0 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
107c0 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
107d0 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
107e0 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
107f0 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
10800 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
10810 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
10820 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
10830 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
10840 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
10850 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
10860 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
10870 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
10880 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
10890 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d  if( pgno!=pPage-
108a0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
108b0 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
108c0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
108d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50  pDbPage);.    pP
108e0 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
108f0 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67  DbPage;.    pPag
10900 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
10910 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
10920 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  pgno;.    pPage-
10930 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e  >hdrOffset = pgn
10940 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
10950 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
10960 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  age->aData==sqli
10970 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
10980 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
10990 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
109a0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
109b0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
109c0 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
109d0 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
109e0 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
109f0 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10a00 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
10a10 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
10a20 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
10a30 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
10a40 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
10a50 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
10a60 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
10a70 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
10a80 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
10a90 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
10aa0 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
10ab0 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
10ac0 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
10ad0 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
10ae0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
10af0 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
10b00 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
10b10 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
10b20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
10b30 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
10b40 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
10b50 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
10b60 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
10b70 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
10b80 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
10b90 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
10ba0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
10bb0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
10bc0 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
10bd0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
10be0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
10bf0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
10c00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10c10 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
10c20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
10c30 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
10c40 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
10c50 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
10c60 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
10c70 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
10c80 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
10c90 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
10ca0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
10cb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
10cc0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
10cd0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
10ce0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
10cf0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10d00 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
10d10 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
10d20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10d30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10d40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
10d50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10d60 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
10d70 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
10d80 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
10d90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
10da0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
10db0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
10dc0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
10dd0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
10de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
10e00 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
10e10 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
10e20 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
10e30 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
10e40 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
10e50 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
10e60 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
10e70 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
10e80 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
10e90 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
10ea0 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
10eb0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
10ec0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
10ed0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
10ee0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
10ef0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
10f00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10f10 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10f20 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
10f30 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
10f40 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
10f50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
10f60 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
10f70 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
10f80 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
10f90 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
10fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10fc0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
10fd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10fe0 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
10ff0 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
11000 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
11010 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
11020 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
11030 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
11040 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
11050 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
11060 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
11070 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
11080 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
11090 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
110a0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
110b0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
110c0 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
110d0 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
110e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
110f0 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
11100 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
11110 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
11120 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
11130 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
11140 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
11150 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
11160 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
11170 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
11180 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
11190 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
111a0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
111b0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
111c0 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
111d0 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
111e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
111f0 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
11200 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
11210 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
11220 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
11230 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
11240 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
11250 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
11260 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
11270 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11280 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
11290 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
112a0 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
112b0 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
112c0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
112d0 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
112e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
112f0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
11300 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
11330 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
11340 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
11350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11360 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11370 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
11380 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
113a0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
113b0 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
113c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
113f0 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
11400 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
11410 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
11420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11430 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
11440 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
11450 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
11460 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
11470 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11480 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11490 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
114a0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
114b0 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
114c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
114d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
114e0 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
114f0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
11500 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
11510 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11520 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
11530 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
11540 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
11550 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11560 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11570 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
11580 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
11590 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
115a0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
115b0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
115c0 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
115d0 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , bReadOnly);.  
115e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f  if( rc ){.    go
115f0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11600 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a  e_error;.  }.  *
11610 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  ppPage = (MemPag
11620 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
11630 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
11640 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ;.  if( (*ppPage
11650 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
11660 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f      btreePageFro
11670 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
11680 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20   pgno, pBt);.   
11690 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
116a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
116b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
116c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
116d0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
116e0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  );.      goto ge
116f0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11700 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
11710 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
11720 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
11730 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
11740 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  age)->aData==sql
11750 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11760 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  (pDbPage) );..  
11770 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20  /* If obtaining 
11780 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72  a child page for
11790 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75   a cursor, we mu
117a0 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74  st verify that t
117b0 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20  he page is.  ** 
117c0 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
117d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a  the root page. *
117e0 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  /.  if( pCur && 
117f0 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c  ((*ppPage)->nCel
11800 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  l<1 || (*ppPage)
11810 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
11820 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20  curIntKey) ){.  
11830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11840 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
11850 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
11860 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  age);.    goto g
11870 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
11880 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ror;.  }.  retur
11890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65  n SQLITE_OK;..ge
118a0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
118b0 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  or:.  if( pCur )
118c0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
118d0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
118e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
118f0 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
11900 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
11910 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11920 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
11930 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
11940 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
11950 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
11960 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
11970 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
11980 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
11990 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
119a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
119b0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
119c0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
119d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
119e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
119f0 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
11a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11a10 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11a20 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11a30 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
11a40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
11a50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11a60 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
11a70 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
11a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11a90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11aa0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
11ab0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11ac0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
11ad0 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
11ae0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
11af0 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
11b00 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
11b10 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
11b20 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
11b30 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
11b40 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
11b50 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
11b60 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
11b70 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
11b80 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
11b90 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
11ba0 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
11bb0 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
11bc0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
11bd0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
11be0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
11bf0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
11c00 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
11c10 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
11c20 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
11c30 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
11c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
11c50 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
11c60 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11c70 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
11c80 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
11c90 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
11ca0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
11cb0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
11cc0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
11cd0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
11ce0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
11cf0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
11d00 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
11d10 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
11d20 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
11d30 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
11d40 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
11d50 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
11d60 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
11d70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
11d80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11d90 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
11da0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
11db0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
11dc0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
11dd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11de0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
11df0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11e10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11e20 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
11e30 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
11e40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
11e50 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
11e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
11e70 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
11e80 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
11e90 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
11ea0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
11eb0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
11ec0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
11ed0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
11ee0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11ef0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
11f00 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
11f10 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
11f20 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
11f30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11f40 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
11f50 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
11f60 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
11f70 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
11f80 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
11f90 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
11fa0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
11fb0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
11fc0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
11fd0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
11fe0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11ff0 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
12000 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
12010 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12020 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12030 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12040 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12050 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
12060 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
12070 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12080 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12090 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
120a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
120b0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
120c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
120d0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
120e0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
120f0 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
12100 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
12110 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
12120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
12130 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
12140 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
12150 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
12160 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
12170 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
12180 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
12190 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
121a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
121b0 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
121c0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
121d0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
121e0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
121f0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
12200 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
12210 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
12220 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
12230 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
12240 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
12250 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
12260 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
12270 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
12280 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
12290 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
122a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
122b0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
122c0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
122d0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
122e0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
122f0 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
12300 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
12310 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
12320 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
12330 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
12340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12350 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12360 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12370 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12380 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
12390 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
123a0 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
123b0 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
123c0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
123d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
123e0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
123f0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
12400 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
12410 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
12420 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
12430 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
12440 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
12450 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
12460 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
12470 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
12480 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
12490 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
124a0 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
124b0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
124c0 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
124d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
124e0 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
124f0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
12500 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
12510 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
12520 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
12530 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
12540 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12550 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
12560 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
12570 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
12580 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
12590 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
125a0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
125b0 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
125c0 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
125d0 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
125e0 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
125f0 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
12600 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
12610 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
12620 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
12630 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12640 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
12650 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
12660 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
12670 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
12680 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
12690 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
126a0 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
126b0 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
126c0 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
126d0 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
126e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
126f0 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
12700 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
12710 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
12720 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
12730 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
12740 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
12750 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
12760 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
12770 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
12780 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
12790 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
127a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
127b0 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
127c0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
127d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
127e0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
127f0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
12800 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
12810 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
12820 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
12830 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
12840 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
12850 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
12860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12870 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
12880 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
12890 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
128a0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
128b0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
128c0 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
128d0 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
128e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
128f0 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
12900 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
12910 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
12940 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
12950 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
12960 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
12970 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
12980 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
12990 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
129a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
129b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
129c0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
129d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
129e0 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a00 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
12a10 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
12a20 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
12a30 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
12a40 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
12a50 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
12a60 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
12a70 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
12a80 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
12a90 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
12aa0 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
12ab0 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
12ac0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
12ad0 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
12ae0 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
12af0 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
12b00 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
12b10 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
12b20 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
12b30 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
12b40 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
12b50 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
12b60 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
12b70 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
12b80 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
12b90 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
12ba0 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
12bb0 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
12bc0 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12be0 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
12bf0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
12c00 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12c20 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
12c30 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
12c40 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
12c50 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
12c60 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
12c70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12c80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12c90 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
12ca0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12cb0 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
12cc0 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
12cd0 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
12ce0 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
12cf0 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
12d00 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
12d10 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
12d20 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
12d30 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
12d40 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
12d50 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
12d60 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
12d70 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
12d80 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
12d90 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
12da0 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
12db0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
12dc0 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
12dd0 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
12de0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12df0 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
12e00 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
12e10 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
12e20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
12e30 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
12e40 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
12e50 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
12e60 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
12e70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
12e80 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
12e90 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
12ea0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
12eb0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
12ec0 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
12ed0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12ee0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12ef0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
12f00 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
12f10 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
12f20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12f30 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
12f40 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
12f50 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
12f60 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
12f70 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
12f80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
12f90 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
12fa0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12fb0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
12fc0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
12fd0 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
12fe0 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
12ff0 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
13000 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
13010 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13020 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
13030 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
13040 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
13050 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
13060 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
13070 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
13080 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
13090 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
130a0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
130b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
130c0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
130d0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
130e0 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
130f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
13100 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
13110 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
13120 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
13130 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
13140 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
13150 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
13160 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
13170 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13180 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
13190 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
131a0 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
131b0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
131c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
131d0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
131e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
131f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
13200 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
13210 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13220 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
13230 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
13240 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
13250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13270 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
13280 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
132c0 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
132d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
132f0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13300 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13310 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13320 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
13330 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
13350 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
13360 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
13370 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
13380 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
13390 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
133a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
133b0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
133c0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
133d0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
133e0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
133f0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13400 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
13410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13420 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
13430 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
13440 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
13450 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
13460 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
13470 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
13480 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
13490 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
134a0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
134b0 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
134c0 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
134d0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
134e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
134f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13500 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
13510 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
13520 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
13530 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
13540 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
13550 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
13560 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
13570 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
13580 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
13590 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
135a0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
135b0 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
135c0 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
135e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
135f0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13620 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
13630 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13640 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
13650 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
13660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13670 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
13680 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13690 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
136a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
136b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
136c0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
136d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
136e0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
136f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13700 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13710 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13720 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
13730 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
13740 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
13750 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
13760 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
13770 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
13780 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
13790 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
137a0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
137b0 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
137c0 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
137d0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
137e0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
137f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
13800 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
13810 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
13820 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
13830 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
13840 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
13850 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
13860 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
13870 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
13880 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
13890 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
138a0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
138b0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
138c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
138d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
138e0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
138f0 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
13900 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
13910 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
13920 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
13930 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
13940 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
13950 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
13960 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
13970 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
13980 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
13990 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
139a0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
139b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
139c0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
139d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
139e0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
139f0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13a00 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
13a10 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13a20 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
13a30 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
13a40 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
13a50 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
13a60 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
13a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13a80 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13a90 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
13aa0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
13ab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13ac0 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
13ad0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
13ae0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
13b10 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
13b20 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
13b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
13b50 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
13b60 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
13b70 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
13b80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13b90 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
13ba0 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
13bb0 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
13bc0 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
13bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13bf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
13c00 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13c10 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
13c20 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
13c30 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
13c40 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
13c50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
13c60 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
13c70 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
13c80 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
13c90 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
13ca0 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
13cb0 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
13cc0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
13cd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
13ce0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
13cf0 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
13d00 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
13d10 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
13d20 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
13d30 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
13d40 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
13d50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
13d60 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
13d70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
13d80 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
13d90 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
13da0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
13db0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
13dc0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
13dd0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
13de0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
13df0 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
13e00 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
13e10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13e20 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
13e30 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
13e40 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
13e50 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
13e60 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
13e70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
13e80 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
13e90 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
13ea0 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
13eb0 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
13ec0 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
13ed0 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
13ee0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
13ef0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
13f00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13f10 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
13f20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
13f30 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
13f40 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
13f50 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
13f60 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
13f70 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
13f80 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
13f90 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
13fa0 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
13fb0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13fc0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
13fd0 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
13fe0 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
13ff0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
14000 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
14010 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
14020 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
14030 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
14040 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
14050 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14060 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
14070 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
14080 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
14090 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
140a0 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
140b0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
140c0 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
140d0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
140e0 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
140f0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
14100 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
14110 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
14120 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
14130 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
14140 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
14150 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14160 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
14170 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
14180 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
14190 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
141a0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
141b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
141c0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
141d0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
141e0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
141f0 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
14200 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14210 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
14220 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
14230 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
14240 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
14250 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
14260 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
14270 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14280 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
14290 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
142a0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
142b0 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
142c0 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
142d0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
142e0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
142f0 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
14300 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
14310 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
14320 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
14330 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
14340 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
14350 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
14360 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
14370 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14380 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14390 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
143a0 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
143b0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
143c0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
143d0 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
143e0 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
143f0 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
14400 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14410 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14420 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14430 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14440 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
14450 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
14460 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
14470 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
14480 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
14490 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  */.    pBt->nRef
144a0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 1;.    if( p-
144b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
144c0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
144d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
144e0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
144f0 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
14500 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
14510 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
14520 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
14530 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
14540 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
14550 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
14560 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14570 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
14580 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
14590 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
145a0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
145b0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
145c0 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
145d0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
145e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
145f0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
14600 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
14610 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
14620 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14640 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
14650 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
14660 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
14670 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
14680 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
14690 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
146a0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
146b0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
146c0 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
146d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
146e0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
146f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
14700 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14710 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14720 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
14730 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
14740 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
14750 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
14760 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
14770 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
14780 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
14790 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
147a0 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
147b0 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
147c0 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
147d0 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
147e0 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
147f0 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
14800 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
14810 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
14820 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
14830 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
14840 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
14850 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
14860 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
14870 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
14880 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
14890 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
148a0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
148b0 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
148c0 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
148d0 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29        if( (uptr)
148e0 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69  p->pBt<(uptr)pSi
148f0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
14900 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
14910 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
14920 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
14930 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
14940 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
14950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14960 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
14970 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69  ext && (uptr)pSi
14980 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75  b->pNext->pBt<(u
14990 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20  ptr)p->pBt ){.  
149a0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
149b0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
149c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
149d0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
149e0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
149f0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
14a00 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
14a10 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
14a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
14a30 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14a40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14a50 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
14a60 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
14a70 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
14a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14a90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
14aa0 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
14ab0 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
14ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14ad0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
14ae0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
14af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14b00 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
14b10 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
14b20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14b30 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
14b40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
14b50 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
14b60 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14b70 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a  e3_file *pFile;.
14b80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
14b90 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
14ba0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
14bb0 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
14bc0 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
14bd0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
14be0 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
14bf0 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
14c00 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
14c10 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
14c20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
14c30 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
14c40 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
14c50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
14c60 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
14c70 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
14c80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
14c90 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
14ca0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
14cb0 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
14cc0 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  E);.    }..    p
14cd0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
14ce0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
14cf0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ger);.    if( pF
14d00 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  ile->pMethods ){
14d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14d20 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
14d30 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43  pFile, SQLITE_FC
14d40 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29  NTL_PDB, (void*)
14d50 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  &pBt->db);.    }
14d60 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
14d70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
14d80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14d90 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
14da0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
14db0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14dc0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  exOpen);.  }.  a
14dd0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
14de0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42  E_OK || sqlite3B
14df0 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
14e00 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20  unt(*ppBtree)>0 
14e10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14e20 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
14e30 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
14e40 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
14e50 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
14e60 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
14e70 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
14e80 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
14e90 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
14ea0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
14eb0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
14ec0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
14ed0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
14ee0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
14ef0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
14f00 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
14f10 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
14f20 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
14f30 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
14f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14f50 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
14f60 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
14f70 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
14f80 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
14f90 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
14fa0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
14fb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14fc0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
14fd0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
14fe0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
14ff0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
15000 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
15010 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
15020 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
15030 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
15040 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
15050 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
15060 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
15070 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15080 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15090 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
150a0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
150b0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
150c0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
150d0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
150e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
150f0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
15100 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15110 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
15120 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
15130 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
15140 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
15150 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
15160 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
15170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15180 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
15190 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
151a0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
151b0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
151c0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
151d0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
151e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
151f0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
15200 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
15210 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
15220 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15230 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
15240 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
15250 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
15260 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
15270 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
15280 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
15290 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
152a0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
152b0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
152c0 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
152d0 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
152e0 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
152f0 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
15300 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
15310 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
15320 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
15330 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15340 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15350 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
15360 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
15370 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
15380 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
15390 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
153a0 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
153b0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
153c0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
153d0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
153e0 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
153f0 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
15400 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
15410 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
15420 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
15430 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
15440 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
15450 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
15460 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
15470 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
15480 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
15490 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
154a0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
154b0 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
154c0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
154d0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
154e0 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
154f0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
15500 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
15510 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
15520 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
15530 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
15540 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
15550 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
15560 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
15570 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
15580 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
15590 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
155a0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
155b0 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
155c0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
155d0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
155e0 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
155f0 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
15600 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
15610 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
15620 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
15630 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
15640 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
15650 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
15660 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
15670 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
15680 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
15690 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
156a0 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
156b0 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
156c0 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
156d0 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
156e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
156f0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
15700 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
15710 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
15720 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
15730 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
15740 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15750 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
15760 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
15770 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
15780 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
15790 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
157a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
157b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
157c0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
157d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
157e0 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
157f0 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
15800 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
15810 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
15820 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
15830 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
15840 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
15850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15860 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
15870 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15880 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
15890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
158a0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
158b0 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
158c0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
158d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
158e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
158f0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15900 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15910 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
15920 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
15930 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
15940 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
15950 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
15960 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
15970 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
15980 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
15990 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
159a0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
159b0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
159c0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
159d0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
159e0 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
159f0 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
15a00 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
15a10 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
15a20 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
15a30 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
15a40 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
15a50 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
15a60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
15a70 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
15a80 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
15a90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15aa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
15ab0 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
15ac0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
15ad0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
15ae0 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
15af0 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
15b00 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
15b10 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
15b20 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
15b30 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
15b40 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
15b50 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
15b60 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
15b70 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
15b80 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
15b90 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
15ba0 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
15bb0 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
15bc0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
15bd0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
15be0 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
15bf0 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
15c00 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
15c10 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
15c20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
15c30 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
15c40 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
15c50 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
15c60 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
15c70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
15c80 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
15c90 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
15ca0 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  db);.    if( pBt
15cb0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
15cc0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
15cd0 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
15ce0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
15cf0 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
15d00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
15d10 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
15d20 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
15d30 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
15d40 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
15d50 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
15d60 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15d70 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
15d80 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
15d90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
15da0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
15db0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
15dc0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
15dd0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
15de0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
15df0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
15e00 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
15e10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15e20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15e30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15e40 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
15e50 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
15e60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
15e70 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
15e80 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
15e90 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
15ea0 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
15eb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
15ec0 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
15ed0 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
15ee0 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
15ef0 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
15f00 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
15f10 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
15f20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
15f30 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
15f40 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
15f50 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
15f60 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
15f70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
15f80 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
15f90 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
15fa0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
15fb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15fc0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15fd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15fe0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15ff0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16000 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
16010 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
16020 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
16030 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
16040 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16050 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16060 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16070 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
16080 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
16090 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
160a0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
160b0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
160c0 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
160d0 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
160e0 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
160f0 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
16100 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
16110 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
16120 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
16130 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
16140 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
16150 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
16160 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
16170 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
16180 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
16190 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
161a0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
161b0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
161c0 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
161d0 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
161e0 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
161f0 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
16200 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
16210 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
16220 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16230 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
16240 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16250 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
16260 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16270 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
16280 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16290 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
162a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
162b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
162c0 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
162d0 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
162e0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
162f0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
16300 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16310 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
16320 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
16330 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
16340 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16350 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
16360 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
16370 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
16380 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
16390 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
163a0 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
163b0 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
163c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
163d0 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
163e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
163f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16400 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16410 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16420 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16430 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
16440 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
16450 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
16460 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
16470 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16480 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16490 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
164a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
164b0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
164c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
164d0 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
164e0 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
164f0 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
16500 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
16510 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
16520 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
16530 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
16540 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
16550 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
16560 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
16570 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
16580 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
16590 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
165a0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
165b0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
165c0 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
165d0 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
165e0 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
165f0 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
16600 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
16610 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
16620 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
16630 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
16640 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
16650 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
16660 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
16670 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
16680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
16690 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
166a0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
166b0 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
166c0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
166d0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
166e0 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
166f0 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
16700 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
16710 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
16720 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
16730 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
16740 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16750 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16760 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16770 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
16780 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16790 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
167a0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
167b0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
167c0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
167d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
167e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
167f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16800 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
16810 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
16820 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
16830 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
16840 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
16850 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
16860 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
16870 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
16880 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16890 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
168a0 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
168b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
168c0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
168d0 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
168e0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
168f0 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
16900 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
16910 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
16920 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
16930 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
16940 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
16950 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
16960 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
16970 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
16980 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
16990 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
169a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
169b0 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
169c0 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
169d0 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
169e0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
169f0 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
16a00 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
16a10 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
16a20 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
16a30 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
16a40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
16a50 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
16a60 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
16a70 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
16a80 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
16a90 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
16aa0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
16ab0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
16ac0 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
16ad0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
16ae0 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
16af0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
16b00 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
16b10 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
16b20 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
16b30 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
16b40 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
16b50 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
16b60 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
16b70 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
16b80 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
16b90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
16ba0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16bb0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
16bc0 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
16bd0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
16be0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16bf0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
16c00 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
16c10 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
16c20 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16c30 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
16c40 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
16c50 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
16c60 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
16c70 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
16c80 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
16c90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16ca0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
16cb0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16cc0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
16cd0 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
16ce0 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
16cf0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
16d00 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
16d10 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
16d20 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
16d30 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
16d40 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
16d50 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
16d60 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
16d70 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
16d80 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
16d90 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
16da0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
16db0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16dc0 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
16dd0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
16de0 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
16df0 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
16e00 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
16e10 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
16e20 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
16e30 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
16e40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
16e50 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
16e60 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
16e70 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
16e80 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
16e90 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
16ea0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
16eb0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
16ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16ed0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16ee0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
16ef0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
16f00 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
16f10 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
16f20 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
16f30 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
16f40 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
16f50 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
16f60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16f70 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
16f80 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
16f90 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
16fa0 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
16fb0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
16fc0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16fd0 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
16fe0 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
16ff0 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
17000 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
17010 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
17020 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
17030 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
17040 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
17050 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
17060 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
17070 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
17080 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
17090 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
170a0 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
170b0 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
170c0 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
170d0 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
170e0 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
170f0 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
17100 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
17110 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
17120 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
17130 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
17140 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
17150 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
17160 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17170 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
17180 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
17190 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
171a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
171b0 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
171c0 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
171d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
171e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
171f0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17200 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17210 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17220 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
17230 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
17240 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
17250 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
17260 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
17270 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
17280 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
17290 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
172a0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
172b0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
172c0 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
172d0 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
172e0 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
172f0 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
17300 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
17310 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
17320 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
17330 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
17340 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
17350 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17360 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
17370 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
17380 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
17390 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
173a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
173b0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
173c0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
173d0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
173e0 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
173f0 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
17400 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
17410 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
17420 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17430 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17440 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
17450 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
17460 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
17470 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
17480 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
17490 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
174a0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
174b0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
174c0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
174d0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
174e0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
174f0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
17500 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
17510 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
17520 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
17530 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
17540 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
17550 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17560 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
17570 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
17580 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
17590 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
175a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
175b0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
175c0 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
175d0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
175e0 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
175f0 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
17600 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
17610 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
17620 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
17630 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
17640 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
17650 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
17660 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
17670 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17680 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
17690 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
176a0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
176b0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
176c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
176d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
176e0 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
176f0 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
17700 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
17710 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17720 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
17730 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
17740 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
17750 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
17760 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
17770 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
17780 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
17790 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
177a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
177b0 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
177c0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
177d0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
177e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
177f0 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
17800 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
17810 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
17820 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
17830 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
17840 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
17850 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
17860 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
17870 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
17880 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
17890 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
178a0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
178b0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
178c0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
178d0 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
178e0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
178f0 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
17900 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17910 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17920 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17930 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
17940 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17950 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
17960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17970 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
17980 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
17990 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
179a0 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
179b0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
179c0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
179d0 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
179e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
179f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
17a00 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
17a10 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
17a20 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
17a30 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
17a40 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
17a50 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
17a60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17a70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17a80 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
17a90 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
17aa0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
17ab0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
17ac0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
17ad0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
17ae0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
17af0 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
17b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17b10 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
17b20 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
17b30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17b40 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
17b50 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
17b60 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
17b70 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
17b80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
17b90 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
17ba0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
17bb0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17bc0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
17bd0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
17be0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
17bf0 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
17c00 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
17c10 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
17c20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17c30 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
17c40 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
17c50 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
17c60 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
17c70 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
17c80 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
17c90 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
17ca0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
17cb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
17cc0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
17cd0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
17ce0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
17cf0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
17d00 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
17d10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
17d20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
17d30 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
17d40 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
17d50 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
17d60 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
17d70 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
17d80 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
17d90 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
17da0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
17db0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
17dc0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
17dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
17de0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
17df0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
17e00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
17e10 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
17e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17e30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
17e40 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
17e50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
17e60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
17e70 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
17e80 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
17e90 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17eb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17ec0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
17ed0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17ee0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
17ef0 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
17f00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
17f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17f20 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17f30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
17f40 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
17f50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17f60 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
17f70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
17f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
17f90 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
17fa0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17fb0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
17fc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17fd0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17fe0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
17ff0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
18000 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
18010 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
18020 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
18030 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
18040 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
18050 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
18060 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
18070 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
18080 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
18090 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
180a0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
180b0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
180c0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
180d0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
180e0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
180f0 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
18100 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
18110 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
18120 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
18130 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
18140 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
18150 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
18160 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
18170 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
18180 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
18190 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
181a0 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
181b0 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
181c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
181d0 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
181e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
181f0 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
18200 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
18210 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
18220 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
18230 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
18240 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
18250 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
18260 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
18270 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18280 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
18290 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
182a0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
182b0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
182c0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
182d0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
182e0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
182f0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
18300 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18310 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18320 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
18330 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
18340 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
18350 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
18360 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
18370 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
18380 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
18390 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
183a0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
183b0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
183c0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
183d0 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
183e0 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
183f0 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
18400 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
18410 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
18420 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
18430 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
18440 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
18450 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
18460 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
18470 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
18480 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
18490 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
184a0 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
184b0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
184c0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
184d0 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
184e0 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
184f0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
18500 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
18510 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
18520 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
18530 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
18540 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
18550 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
18560 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
18570 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
18580 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
18590 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
185a0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
185b0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
185c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
185d0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
185e0 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
185f0 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
18600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
18620 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
18640 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18650 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c  SYNCHRONOUS!=SQL
18660 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
18670 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20 20 20 20  SYNCHRONOUS.    
18680 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
18690 0a 20 20 20 20 20 20 20 20 44 62 20 2a 70 44 62  .        Db *pDb
186a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
186b0 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26  b=pBt->db)!=0 &&
186c0 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d   (pDb=db->aDb)!=
186d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
186e0 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
186f0 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
18700 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
18710 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ; }.          if
18720 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d  ( pDb->bSyncSet=
18730 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
18740 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
18750 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  el==SQLITE_DEFAU
18760 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  LT_SYNCHRONOUS+1
18770 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
18780 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
18790 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51  afety_level = SQ
187a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
187b0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a  _SYNCHRONOUS+1;.
187c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
187d0 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
187e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20  (pBt->pPager,.  
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62               pDb
18800 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c  ->safety_level |
18810 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41   (db->flags & PA
18820 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29  GER_FLAGS_MASK))
18830 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18840 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
18850 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
18860 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
18870 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
18880 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
18890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
188a0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
188b0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
188c0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
188d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
188e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
188f0 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54   R-15465-20813 T
18900 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d  he maximum and m
18910 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  inimum embedded 
18920 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66  payload.    ** f
18930 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  ractions and the
18940 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72   leaf payload fr
18950 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75  action values mu
18960 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e  st be 64, 32, an
18970 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  d 32..    **.   
18980 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
18990 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
189a0 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
189b0 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
189c0 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
189d0 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
189e0 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
189f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
18a00 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
18a10 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
18a20 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
18a30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18a40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18a50 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
18a60 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
18a70 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
18a80 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
18a90 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
18aa0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
18ab0 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
18ac0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
18ad0 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
18ae0 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
18af0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
18b00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18b10 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a  . */.    pageSiz
18b20 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
18b30 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
18b40 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  <16);.    /* EVI
18b50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30  DENCE-OF: R-2500
18b60 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65  8-21688 The size
18b70 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20   of a page is a 
18b80 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20  power of two.   
18b90 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20   ** between 512 
18ba0 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73  and 65536 inclus
18bb0 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ive. */.    if( 
18bc0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
18bd0 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
18be0 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
18bf0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
18c00 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
18c10 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
18c20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18c30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18c40 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18c50 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
18c60 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  0 );.    /* EVID
18c70 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30  ENCE-OF: R-59310
18c80 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65  -51205 The "rese
18c90 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65  rved space" size
18ca0 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20   in the 1-byte. 
18cb0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74     ** integer at
18cc0 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68   offset 20 is th
18cd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18ce0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
18cf0 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
18d00 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73  each page to res
18d10 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69  erve for extensi
18d20 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ons. .    **.   
18d30 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
18d40 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
18d50 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
18d60 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
18d70 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
18d80 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
18d90 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
18da0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
18db0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
18dc0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
18dd0 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
18de0 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c  er. */.    usabl
18df0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
18e00 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
18e10 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
18e20 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
18e30 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
18e40 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
18e50 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
18e60 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
18e70 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
18e80 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
18e90 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
18ea0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
18eb0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
18ec0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
18ed0 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
18ee0 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
18ef0 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
18f00 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
18f10 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
18f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f30 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
18f40 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
18f50 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
18f60 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
18f70 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
18f80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18f90 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
18fa0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
18fb0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
18fc0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
18fd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
18fe0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
18ff0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
19000 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19010 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
19020 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
19030 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
19040 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19060 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
19070 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
19080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19090 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
190a0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
190b0 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
190c0 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
190d0 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
190e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
190f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
19100 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19110 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
19120 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19130 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34  F: R-28312-64704
19140 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73   However, the us
19150 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  able size is not
19160 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20   allowed to.    
19170 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ** be less than 
19180 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  480. In other wo
19190 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65  rds, if the page
191a0 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68   size is 512, th
191b0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
191c0 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a  served space siz
191d0 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
191e0 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75  32. */.    if( u
191f0 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
19200 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19210 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19220 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
19230 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
19240 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
19250 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
19260 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
19270 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19280 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
19290 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
192a0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
192b0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
192c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
192d0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
192e0 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
192f0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
19300 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
19310 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
19320 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
19330 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
19340 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
19350 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
19360 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
19370 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
19380 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
19390 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
193a0 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
193b0 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
193c0 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
193d0 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
193e0 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
193f0 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
19400 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
19410 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
19420 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
19430 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
19440 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
19450 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
19460 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
19470 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
19480 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
19490 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
194a0 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
194b0 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
194c0 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65  te pointer, a he
194d0 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
194e0 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
194f0 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
19500 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
19510 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
19520 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
19530 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
19540 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
19550 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
19560 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
19570 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
19580 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
19590 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  minLocal = (u16)
195a0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
195b0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
195c0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  3);.  pBt->maxLe
195d0 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  af = (u16)(pBt->
195e0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29  usableSize - 35)
195f0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
19600 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
19610 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
19620 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66  /255 - 23);.  if
19630 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e  ( pBt->maxLocal>
19640 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  127 ){.    pBt->
19650 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
19660 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 127;.  }else{.
19670 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
19680 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70  ePayload = (u8)p
19690 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
196a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
196b0 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
196c0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
196d0 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
196e0 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
196f0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
19700 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
19710 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
19720 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
19730 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
19740 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
19750 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
19760 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
19770 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
19780 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19790 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
197a0 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
197b0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
197c0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
197d0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
197e0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
197f0 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
19800 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
19810 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
19820 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
19830 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
19840 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
19850 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
19860 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
19870 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
19880 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
19890 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
198a0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
198b0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
198c0 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
198d0 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
198e0 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
198f0 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
19900 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
19910 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
19920 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
19930 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
19940 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
19950 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
19960 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
19970 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
19980 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
19990 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
199a0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
199b0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
199c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
199d0 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
199e0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
199f0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
19a00 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
19a10 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
19a20 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
19a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
19a40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
19a50 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
19a60 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
19a70 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
19a80 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
19a90 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
19aa0 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
19ab0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
19ac0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
19ad0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
19ae0 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
19af0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
19b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
19b10 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
19b20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
19b30 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
19b40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
19b50 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
19b60 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
19b70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19b80 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
19b90 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
19ba0 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
19bb0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
19bc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19bd0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19be0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
19bf0 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
19c00 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
19c10 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19c20 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
19c30 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
19c40 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19c50 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
19c60 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
19c70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
19c80 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
19c90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19ca0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
19cb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
19cc0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
19cd0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
19ce0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
19cf0 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
19d00 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
19d10 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
19d20 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
19d30 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
19d40 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
19d50 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
19d60 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
19d70 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
19d80 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
19d90 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
19da0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
19db0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
19dc0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
19dd0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
19de0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
19df0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
19e00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19e20 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
19e30 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
19e40 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
19e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19e60 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
19e70 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
19e80 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
19e90 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
19ea0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
19eb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
19ec0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
19ed0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19ee0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
19ef0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
19f00 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
19f10 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
19f20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
19f30 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
19f40 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
19f50 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
19f60 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
19f70 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
19f80 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
19f90 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
19fa0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
19fb0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
19fc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
19fd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
19fe0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
19ff0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1a000 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1a010 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1a020 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1a030 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1a040 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1a050 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1a060 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1a070 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1a080 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1a090 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1a0a0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1a0b0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1a0c0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1a0d0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1a0e0 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1a0f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1a100 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1a110 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a120 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1a130 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1a140 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1a150 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1a160 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1a170 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a180 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1a190 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1a1a0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1a1b0 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1a1c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1a1d0 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1a1e0 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1a1f0 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1a200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a210 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1a220 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1a230 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a240 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1a250 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1a260 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1a270 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1a280 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1a290 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1a2a0 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1a2b0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1a2c0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1a2d0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1a2e0 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1a2f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1a300 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1a310 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1a320 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1a330 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1a340 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1a350 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a360 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1a380 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1a390 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1a3a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a3b0 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1a3c0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1a3d0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1a3e0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1a3f0 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1a400 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1a410 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1a420 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1a430 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1a440 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1a450 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1a460 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1a470 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1a480 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1a490 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1a4a0 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1a4b0 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1a4c0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1a4d0 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1a4e0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1a4f0 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1a500 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1a510 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1a520 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1a530 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1a540 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a550 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1a560 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1a570 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1a580 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1a590 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1a5a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1a5b0 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1a5c0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1a5d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1a5e0 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1a5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a600 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1a610 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a620 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1a630 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1a640 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1a650 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1a660 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1a670 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1a680 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1a690 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a6a0 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1a6b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a6c0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1a6d0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1a6e0 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1a6f0 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1a700 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1a710 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1a720 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1a730 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1a740 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1a750 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1a760 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1a770 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1a780 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1a790 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1a7a0 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1a7b0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1a7c0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1a7d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1a7e0 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1a7f0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1a800 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1a810 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1a820 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1a830 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1a840 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1a850 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1a860 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1a870 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1a880 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1a890 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1a8a0 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1a8b0 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1a8c0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1a8d0 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1a8e0 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1a8f0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1a900 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1a910 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1a920 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1a930 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1a940 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1a950 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1a960 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1a970 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1a980 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1a990 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1a9a0 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1a9b0 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1a9c0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1a9d0 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1a9e0 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1a9f0 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1aa00 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1aa10 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1aa20 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1aa30 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
1aa40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1aa50 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1aa60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1aa70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1aa80 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1aa90 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1aaa0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
1aab0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1aac0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1aad0 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
1aae0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
1aaf0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
1ab00 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
1ab10 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
1ab20 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
1ab30 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1ab40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1ab50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1ab60 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
1ab70 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
1ab80 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
1ab90 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1aba0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1abb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1abc0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
1abd0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
1abe0 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
1abf0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
1ac00 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
1ac10 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
1ac20 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
1ac30 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
1ac40 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1ac50 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1ac60 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1ac70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1ac80 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1ac90 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1aca0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1acb0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1acc0 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  HE.  {.    sqlit
1acd0 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
1ace0 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65      /* If anothe
1acf0 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
1ad00 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
1ad10 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
1ad20 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
1ad30 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
1ad40 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
1ad50 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
1ad60 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1ad70 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74  s.    ** request
1ad80 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
1ad90 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f  E_LOCKED..    */
1ada0 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61 67  .    if( (wrflag
1adb0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1adc0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1add0 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42  ITE).     || (pB
1ade0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1adf0 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
1ae00 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63    ){.      pBloc
1ae10 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
1ae20 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->db;.    }else 
1ae30 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
1ae40 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49        BtLock *pI
1ae50 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ter;.      for(p
1ae60 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1ae70 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1ae80 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1ae90 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1aea0 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
1aeb0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
1aec0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
1aed0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  b;.          bre
1aee0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1aef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1af00 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
1af10 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
1af20 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
1af30 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
1af40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
1af50 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
1af60 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  E;.      goto tr
1af70 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d  ans_begun;.    }
1af80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1af90 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20  * Any read-only 
1afa0 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72  or read-write tr
1afb0 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65  ansaction implie
1afc0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
1afd0 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53   .  ** page 1. S
1afe0 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  o if some other 
1aff0 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69  shared-cache cli
1b000 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20  ent already has 
1b010 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20  a write-lock .  
1b020 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  ** on page 1, th
1b030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e transaction ca
1b040 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20  nnot be opened. 
1b050 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
1b060 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1b070 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
1b080 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a  OT, READ_LOCK);.
1b090 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1b0a0 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73  =rc ) goto trans
1b0b0 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e  _begun;..  pBt->
1b0c0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1b0d0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1b0e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1b0f0 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73  ge==0 ) pBt->bts
1b100 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49  Flags |= BTS_INI
1b110 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1b120 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
1b130 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
1b140 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
1b150 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
1b160 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
1b170 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
1b180 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
1b190 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
1b1a0 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
1b1b0 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
1b1c0 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
1b1d0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
1b1e0 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
1b1f0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
1b200 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
1b210 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
1b220 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
1b230 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
1b240 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
1b250 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
1b260 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
1b270 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
1b280 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
1b290 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
1b2a0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b2b0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
1b2c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
1b2d0 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
1b2e0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
1b2f0 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
1b300 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
1b310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1b320 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
1b330 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1b340 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1b350 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1b360 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1b370 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1b380 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b390 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1b3a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
1b3b0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
1b3c0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
1b3d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b3e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b3f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
1b400 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1b410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b420 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1b430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b440 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1b450 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1b460 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1b470 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1b480 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1b490 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b4a0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1b4b0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1b4c0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1b4d0 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
1b4e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b4f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1b500 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1b510 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1b520 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
1b530 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b540 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1b550 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
1b560 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1b570 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
1b580 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
1b590 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
1b5a0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1b5b0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
1b5c0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
1b5d0 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
1b5e0 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
1b5f0 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
1b600 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
1b610 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1b620 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
1b630 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
1b640 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
1b650 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1b660 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
1b670 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
1b680 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b690 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
1b6a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
1b6b0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
1b6c0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1b6d0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
1b6e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b6f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1b700 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
1b710 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
1b720 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
1b730 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
1b740 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1b750 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1b760 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
1b770 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1b780 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
1b790 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
1b7a0 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
1b7b0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
1b7c0 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
1b7d0 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
1b7e0 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
1b7f0 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
1b800 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1b810 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
1b820 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
1b830 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
1b840 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
1b850 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
1b860 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
1b870 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
1b880 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
1b890 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
1b8a0 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
1b8b0 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
1b8c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
1b8d0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
1b8e0 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
1b8f0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1b900 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
1b910 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
1b920 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
1b930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b940 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1b950 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1b960 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1b970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b980 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1b990 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1b9a0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1b9b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
1b9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b9d0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
1b9e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b9f0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1ba00 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1ba10 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1ba20 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1ba30 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1ba40 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
1ba50 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
1ba60 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
1ba70 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
1ba80 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
1ba90 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
1baa0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
1bab0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
1bac0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1bad0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1bae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1baf0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1bb00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
1bb10 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
1bb20 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1bb30 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
1bb40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1bb50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bb60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bb70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1bb80 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
1bb90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1bba0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
1bbb0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
1bbc0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
1bbd0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
1bbe0 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
1bbf0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1bc00 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
1bc10 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
1bc20 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
1bc30 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
1bc40 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1bc50 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1bc60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1bc70 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1bca0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1bcb0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bce0 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
1bcf0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bd20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1bd30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1bd40 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1bd50 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
1bd60 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
1bd70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1bd80 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1bd90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1bda0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1bdb0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1bdc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1bdd0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c  turn rc;.  nCell
1bde0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1bdf0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1be00 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1be10 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1be20 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1be30 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1be40 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1be50 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1be60 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1be70 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1be80 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1be90 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1bea0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1beb0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1bec0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1bed0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1bee0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1bef0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1bf00 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1bf10 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1bf20 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1bf30 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1bf40 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1bf50 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1bf60 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1bf70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1bf80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1bf90 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1bfa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1bfb0 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1bfc0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1bfd0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1bfe0 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1bff0 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1c000 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1c010 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1c020 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1c030 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1c040 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1c050 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1c060 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1c070 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1c080 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1c0a0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1c0b0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1c0c0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1c0d0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1c0e0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1c0f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1c120 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1c130 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1c140 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1c150 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1c160 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1c170 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1c180 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1c190 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1c1a0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1c1b0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1c1c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c1d0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1c1e0 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1c1f0 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1c200 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1c210 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1c220 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c230 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1c240 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1c250 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1c260 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1c270 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1c280 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1c290 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1c2a0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1c2b0 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1c2c0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1c2d0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1c2e0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1c2f0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1c300 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1c310 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1c320 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c330 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
1c340 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1c350 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
1c360 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
1c370 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
1c380 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72    int rc;..    r
1c390 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1c3a0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1c3b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1c3c0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1c3d0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1c3e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1c3f0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1c400 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1c410 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1c420 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1c430 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1c440 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1c450 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1c460 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1c470 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1c480 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1c490 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63     if( info.nLoc
1c4a0 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
1c4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1c4c0 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  ( pCell+info.nSi
1c4d0 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  ze > pPage->aDat
1c4e0 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  a+pPage->pBt->us
1c4f0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
1c500 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c510 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c520 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
1c530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
1c540 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1c550 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1c560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1c570 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b   put4byte(pCell+
1c580 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54  info.nSize-4, iT
1c590 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
1c5a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1c5b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1c5c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c5d0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1c5e0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1c5f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1c600 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1c610 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c630 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1c640 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1c650 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1c660 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1c670 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1c680 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1c690 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1c6a0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1c6b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1c6c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c6d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
1c6e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1c6f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c700 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1c710 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iTo);.    }.  }.
1c720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c730 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1c740 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1c750 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1c760 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1c770 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1c780 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1c790 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1c7a0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1c7b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1c7c0 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1c7d0 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1c7e0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1c7f0 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1c800 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1c810 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1c820 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1c830 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1c840 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1c850 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1c860 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1c870 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1c880 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1c890 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1c8a0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1c8b0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1c8c0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1c8d0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1c8e0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1c8f0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1c900 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1c910 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1c920 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c930 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1c940 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1c950 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1c960 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1c970 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1c980 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1c990 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c9a0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1c9b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1c9c0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1c9d0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1c9e0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1c9f0 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1ca00 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1ca10 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1ca20 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1ca30 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1ca40 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1ca50 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1ca60 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1ca70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1ca80 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1ca90 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1caa0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1cab0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1cac0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1cad0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1cae0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1caf0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1cb00 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1cb10 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1cb20 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1cb30 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1cb40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1cb50 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1cb60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1cb70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1cb80 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
1cb90 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1cba0 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1cbb0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1cbc0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1cbd0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1cbe0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1cbf0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1cc00 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1cc10 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1cc20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1cc30 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1cc40 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1cc50 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1cc60 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1cc70 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1cc80 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1cc90 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1cca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ccb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ccc0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1ccd0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1cce0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1ccf0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1cd00 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1cd10 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1cd20 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1cd30 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1cd40 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1cd50 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1cd60 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1cd70 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1cd80 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1cd90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1cda0 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1cdb0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1cdc0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1cdd0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1cde0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1cdf0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1ce00 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1ce10 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1ce20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1ce30 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1ce40 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1ce50 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1ce60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1ce70 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1ce80 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1ce90 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1cea0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1ceb0 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1cec0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1ced0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1cef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1cf00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1cf10 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1cf20 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1cf30 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1cf40 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1cf50 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1cf60 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1cf70 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1cf80 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1cf90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1cfa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cfb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cfc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1cfd0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1cfe0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1cff0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1d000 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1d010 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1d020 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1d030 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1d040 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1d050 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1d060 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1d070 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1d080 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1d090 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1d0a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1d0b0 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1d0c0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1d0d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d0e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d0f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1d100 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d110 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1d120 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1d130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d140 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d150 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1d160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d170 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1d180 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1d190 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1d1a0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1d1b0 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1d1c0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1d1d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d1e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1d1f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1d200 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1d210 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1d220 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d230 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1d240 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1d250 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1d260 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1d270 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1d280 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1d290 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1d2a0 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1d2b0 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1d2c0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1d2d0 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1d2e0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1d2f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1d300 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1d310 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1d320 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1d330 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1d340 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1d350 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1d360 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1d370 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1d380 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1d390 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1d3a0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1d3b0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1d3c0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1d3d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1d3e0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1d3f0 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1d400 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1d410 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1d420 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1d430 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1d440 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1d450 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1d460 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1d470 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1d480 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1d490 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1d4a0 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1d4b0 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1d4c0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1d4d0 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1d4e0 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1d4f0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1d500 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1d510 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1d520 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1d530 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1d540 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1d550 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1d560 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1d570 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1d580 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1d590 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1d5a0 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1d5b0 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1d5c0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1d5d0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1d5e0 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1d5f0 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1d600 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1d610 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1d620 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1d630 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1d640 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1d650 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d660 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1d670 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1d680 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1d690 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d6a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1d6b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1d6c0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1d6d0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1d6e0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1d6f0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1d700 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1d710 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1d720 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1d730 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1d740 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1d750 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1d760 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1d770 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1d780 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1d790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1d7a0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1d7b0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1d7c0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1d7d0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1d7e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d810 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1d820 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1d830 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d840 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d850 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1d860 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1d870 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1d880 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1d890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1d8a0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1d8b0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1d8c0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1d8d0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1d8e0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1d8f0 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1d900 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1d910 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1d920 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1d930 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1d940 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1d950 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1d960 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1d970 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1d980 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1d990 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1d9a0 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1d9b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d9c0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1d9d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1d9e0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d9f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1da00 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1da10 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1da20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1da30 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1da40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1da50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1da60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1da70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1da80 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1da90 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1daa0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1dab0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1dac0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1dad0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1daf0 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1db00 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1db10 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1db20 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1db30 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1db40 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1db50 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1db60 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1db70 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1db80 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1db90 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1dba0 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1dbb0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1dbc0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1dbd0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1dbe0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1dbf0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1dc00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1dc10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dc20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1dc30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1dc40 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1dc50 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1dc60 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1dc70 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1dc80 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1dc90 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1dca0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1dcb0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1dcc0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1dcd0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1dce0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1dcf0 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1dd00 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1dd10 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1dd20 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1dd30 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1dd40 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1dd50 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1dd60 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1dd70 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1dd80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1dd90 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1dda0 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1ddb0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1ddc0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1ddd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dde0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1ddf0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1de00 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1de10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1de20 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1de30 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1de40 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1de50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1de60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1de70 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1de80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1de90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1dea0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1deb0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1dec0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1ded0 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1dee0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1def0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1df00 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1df10 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1df20 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1df30 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1df40 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1df50 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1df60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1df70 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1df80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1df90 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1dfa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1dfb0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1dfc0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1dfd0 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1dfe0 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1dff0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1e000 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e010 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1e020 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1e030 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1e040 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1e050 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1e060 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1e070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e080 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1e090 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1e0a0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1e0b0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1e0c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1e0d0 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1e0e0 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1e0f0 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1e100 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1e110 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
1e120 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e130 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
1e140 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
1e150 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1e160 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
1e170 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
1e180 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
1e190 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
1e1a0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1e1d0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
1e1e0 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
1e1f0 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e210 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
1e220 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
1e230 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
1e240 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
1e250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e260 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
1e270 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
1e280 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
1e290 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
1e2a0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
1e2b0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
1e2c0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1e2d0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1e2e0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1e2f0 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1e300 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e310 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1e320 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e330 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1e340 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1e350 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1e360 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1e370 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e380 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1e390 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1e3a0 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1e3b0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1e3c0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1e3d0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1e3e0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1e3f0 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1e400 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1e410 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1e420 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1e430 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1e440 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1e450 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1e460 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1e470 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1e480 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1e490 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1e4a0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1e4b0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1e4c0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1e4d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e4e0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1e4f0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1e500 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1e510 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1e520 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1e530 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1e540 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1e550 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1e560 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1e570 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1e580 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1e590 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1e5a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1e5b0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1e5c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1e5d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1e5e0 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1e5f0 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1e600 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1e610 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1e620 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1e630 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e640 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1e650 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1e660 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1e670 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1e680 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1e690 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e6a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e6b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1e6c0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1e6d0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1e6e0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1e6f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e710 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1e720 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1e730 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1e740 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1e750 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1e760 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1e790 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e7a0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1e7b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e7c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e7d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e7e0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1e7f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e800 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1e810 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1e820 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1e830 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1e840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e850 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e860 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1e870 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1e880 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1e890 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1e8a0 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1e8b0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1e8c0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1e8d0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1e8e0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1e8f0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1e900 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1e910 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1e920 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1e930 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1e940 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1e950 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1e960 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1e970 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1e980 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1e990 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1e9a0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1e9b0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1e9c0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1e9d0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1e9e0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1e9f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ea00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ea10 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1ea20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1ea30 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1ea40 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1ea50 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
1ea60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ea70 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1ea80 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1ea90 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1eaa0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1eab0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1eac0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1ead0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1eae0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1eaf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1eb00 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1eb10 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1eb20 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1eb30 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1eb40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1eb50 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1eb60 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1eb70 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1eb80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1eb90 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1eba0 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1ebb0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1ebc0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1ebd0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1ebe0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1ebf0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1ec00 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1ec10 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1ec20 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1ec30 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ec40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1ec50 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1ec60 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1ec70 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1ec80 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1ec90 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1eca0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1ecb0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1ecc0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1ecd0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1ece0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1ecf0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1ed00 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1ed10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1ed20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ed30 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1ed40 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1ed50 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1ed60 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1ed70 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1ed80 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1ed90 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1eda0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1edb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1edc0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1edd0 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1ede0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1edf0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1ee00 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1ee10 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1ee20 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1ee30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1ee40 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1ee50 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1ee60 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1ee70 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1ee80 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1ee90 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1eea0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1eeb0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1eec0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1eed0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1eee0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1eef0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1ef00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1ef10 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1ef20 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1ef30 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1ef40 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1ef50 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1ef60 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1ef70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1ef80 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1ef90 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1efa0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1efb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1efc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1efd0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1efe0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1eff0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f000 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1f010 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1f020 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1f030 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1f040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f050 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1f060 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1f070 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1f080 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1f090 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f0a0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1f0b0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1f0c0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1f0d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1f0e0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1f0f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1f100 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1f110 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1f120 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1f130 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1f140 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1f150 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1f160 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1f170 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1f180 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1f190 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1f1a0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1f1b0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1f1c0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1f1d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1f1e0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1f1f0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1f200 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1f210 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1f220 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1f230 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1f240 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1f250 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1f260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1f270 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1f280 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1f290 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1f2a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1f2b0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1f2c0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1f2d0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1f2e0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1f2f0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1f300 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1f310 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1f320 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1f330 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1f340 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1f350 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1f360 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1f370 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1f380 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1f390 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1f3a0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1f3b0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1f3c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1f3d0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1f3e0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1f3f0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1f400 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1f410 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1f420 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1f430 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1f440 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1f450 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1f460 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1f470 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1f480 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1f490 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1f4a0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1f4b0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1f4c0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1f4d0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1f4e0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1f4f0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1f500 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1f510 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1f520 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1f530 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1f540 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1f550 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1f560 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1f570 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1f580 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1f590 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1f5a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1f5b0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1f5c0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1f5d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1f5e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f5f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1f600 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1f610 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1f620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f630 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1f640 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f650 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1f660 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1f670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1f680 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1f690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f6a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1f6b0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1f6c0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1f6d0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1f6e0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
1f6f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f700 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f710 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f720 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f730 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f740 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
1f750 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
1f760 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f770 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
1f780 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
1f790 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
1f7a0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
1f7b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f7c0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
1f7d0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
1f7e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1f7f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1f800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f820 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1f830 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
1f840 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
1f850 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
1f860 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
1f870 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
1f880 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
1f890 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
1f8a0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
1f8b0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
1f8c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1f8d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1f8e0 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
1f8f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1f900 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1f910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f920 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f930 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1f940 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
1f950 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1f960 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
1f970 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
1f980 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1f990 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
1f9a0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
1f9b0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
1f9c0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1f9d0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
1f9e0 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
1f9f0 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
1fa00 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
1fa10 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
1fa20 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
1fa30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1fa40 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
1fa50 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
1fa60 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1fa70 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1fa80 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1fa90 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1faa0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
1fab0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
1fac0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
1fad0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
1fae0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1faf0 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
1fb00 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
1fb10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1fb20 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
1fb30 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
1fb40 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1fb50 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
1fb60 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1fb70 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
1fb80 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
1fb90 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
1fba0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
1fbb0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
1fbc0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
1fbd0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1fbe0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1fbf0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1fc00 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
1fc10 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
1fc20 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
1fc30 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1fc40 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
1fc50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fc60 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1fc70 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1fc80 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
1fc90 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
1fca0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
1fcb0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
1fcc0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
1fcd0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
1fce0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
1fcf0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1fd00 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1fd10 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1fd20 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
1fd30 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1fd40 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
1fd50 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1fd60 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
1fd70 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1fd80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fd90 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
1fda0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
1fdb0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
1fdc0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
1fdd0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1fde0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
1fdf0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1fe00 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
1fe10 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
1fe20 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
1fe30 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
1fe40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1fe50 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
1fe60 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
1fe70 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
1fe80 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1fe90 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
1fea0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
1feb0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
1fec0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
1fed0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
1fee0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
1fef0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
1ff00 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
1ff10 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
1ff20 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
1ff30 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
1ff40 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1ff50 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
1ff60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
1ff70 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
1ff80 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1ff90 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1ffa0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1ffb0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1ffc0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1ffd0 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1ffe0 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1fff0 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
20000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20010 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
20020 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
20030 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
20040 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
20050 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
20060 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
20070 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
20080 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
20090 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
200a0 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
200b0 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
200c0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
200d0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
200e0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
200f0 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
20100 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
20110 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20120 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
20130 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
20140 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
20150 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
20160 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
20170 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
20180 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
20190 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
201a0 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
201b0 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
201c0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
201d0 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
201e0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
201f0 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
20200 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
20210 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
20220 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
20230 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
20240 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
20250 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
20260 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
20270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20280 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
20290 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
202a0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
202b0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
202c0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
202d0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
202e0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
202f0 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
20300 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
20310 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
20320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20330 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
20340 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
20350 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
20360 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
20370 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
20380 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
20390 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
203a0 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
203b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
203c0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
203d0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
203e0 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
203f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20400 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
20410 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
20420 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20430 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
20440 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20450 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
20460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
20470 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
20480 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
20490 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
204a0 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
204b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
204c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
204d0 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
204e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
204f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
20500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20510 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
20520 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
20530 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
20540 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
20550 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
20560 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
20570 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
20580 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
20590 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
205a0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
205b0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
205c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
205d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
205e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
205f0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
20600 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
20610 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
20620 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
20630 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
20640 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
20650 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
20660 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20670 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
20680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20690 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
206a0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
206b0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
206c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
206d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
206e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
206f0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
20700 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
20710 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
20720 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
20730 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
20740 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
20750 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
20760 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
20770 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
20780 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
20790 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
207a0 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
207b0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
207c0 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
207d0 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
207e0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
207f0 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
20800 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
20810 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
20820 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
20830 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
20840 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
20850 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
20860 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
20870 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
20880 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
20890 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
208a0 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
208b0 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
208c0 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
208d0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
208e0 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
208f0 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
20900 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
20910 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
20920 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
20930 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
20940 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
20950 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
20960 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
20970 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
20980 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
20990 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
209a0 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
209b0 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
209c0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
209d0 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
209e0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
209f0 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
20a00 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
20a10 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
20a20 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
20a30 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
20a40 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
20a50 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
20a60 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
20a70 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
20a80 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
20a90 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
20aa0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
20ab0 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
20ac0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
20ad0 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
20ae0 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
20af0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
20b00 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
20b10 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
20b20 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
20b30 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
20b40 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
20b50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20b60 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
20b70 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
20b80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
20b90 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
20ba0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
20bb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
20bc0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
20bd0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
20be0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
20bf0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
20c00 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20c10 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
20c20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
20c30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
20c40 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
20c50 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
20c60 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
20c70 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
20c80 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
20c90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20ca0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
20cb0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
20cc0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
20cd0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
20ce0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
20cf0 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
20d00 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
20d10 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
20d20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20d30 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
20d40 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
20d50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
20d60 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
20d70 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
20d80 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
20d90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
20da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20db0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
20dc0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20dd0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
20de0 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
20df0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20e10 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
20e20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20e30 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
20e40 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
20e50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
20e60 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
20e70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
20e80 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
20e90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
20ea0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
20eb0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
20ec0 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
20ed0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
20ee0 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
20ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
20f00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20f10 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
20f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20f30 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
20f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
20f50 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
20f60 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
20f70 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
20f80 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
20f90 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
20fa0 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
20fb0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
20fc0 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
20fd0 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
20fe0 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
20ff0 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
21000 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
21010 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
21020 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
21030 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
21040 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
21050 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
21060 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
21070 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
21080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21090 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
210a0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
210b0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
210c0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
210d0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
210e0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
210f0 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
21100 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
21110 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
21120 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
21130 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21140 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21150 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
21160 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
21170 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
21180 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
21190 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
211a0 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
211b0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
211c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
211d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
211e0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
211f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
21200 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
21210 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
21220 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21230 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
21240 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21250 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21260 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
21270 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
21280 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
21290 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
212a0 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
212b0 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
212c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
212d0 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
212e0 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
212f0 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
21300 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
21310 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
21320 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
21330 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
21340 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21350 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
21360 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
21370 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
21380 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21390 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
213a0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
213b0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
213c0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
213d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
213e0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
213f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
21400 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
21410 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
21420 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
21430 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
21440 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
21450 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
21460 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
21470 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
21480 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
21490 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
214a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
214b0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
214c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
214d0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
214e0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
214f0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
21500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21510 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
21520 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21530 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
21540 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
21550 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
21570 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
21580 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
21590 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
215a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
215b0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
215c0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
215d0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
215e0 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
215f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21600 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
21610 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
21620 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
21630 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
21640 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
21650 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21660 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
21670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
21680 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
21690 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
216a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
216b0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
216c0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
216d0 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
216e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
216f0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
21700 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
21710 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
21720 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
21730 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
21740 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
21750 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
21760 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
21770 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
21780 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
21790 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
217a0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
217b0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
217c0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
217d0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
217e0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
217f0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
21800 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
21810 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
21820 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
21830 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
21840 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
21850 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
21860 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
21870 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
21880 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
21890 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
218a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
218b0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
218c0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
218d0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
218e0 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
218f0 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
21900 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
21910 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
21920 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
21930 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
21940 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
21950 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
21960 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
21970 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
21980 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
21990 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
219a0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
219b0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
219c0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
219d0 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
219e0 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
219f0 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
21a00 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
21a10 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
21a20 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
21a30 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
21a40 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
21a50 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
21a60 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
21a70 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
21a80 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
21a90 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
21aa0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21ab0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
21ac0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
21ad0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
21ae0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21af0 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
21b00 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
21b10 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
21b20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
21b30 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
21b40 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
21b50 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
21b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
21b70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
21b80 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
21b90 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
21ba0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
21bb0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21bc0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
21bd0 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
21be0 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
21bf0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
21c00 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
21c10 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
21c20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
21c30 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
21c40 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
21c50 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
21c60 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
21c70 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
21c80 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21c90 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
21ca0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
21cb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
21cc0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
21cd0 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
21ce0 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
21cf0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
21d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21d10 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
21d20 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
21d30 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
21d40 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
21d50 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
21d60 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
21d70 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
21d80 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
21d90 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
21da0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
21db0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
21dc0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
21dd0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
21de0 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
21df0 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
21e00 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
21e10 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
21e20 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
21e30 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
21e40 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
21e50 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
21e60 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
21e70 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
21e80 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
21e90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
21ea0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
21eb0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
21ec0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
21ed0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
21ee0 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
21ef0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
21f00 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
21f10 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
21f20 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
21f30 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
21f40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
21f50 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
21f60 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
21f70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
21f80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21f90 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
21fa0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21fb0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
21fc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21fd0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21fe0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
21ff0 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
22000 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
22010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
22020 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
22030 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
22040 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
22050 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
22060 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22070 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ter(p);.    if( 
22080 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
22090 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
220a0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
220b0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
220c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
220d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
220e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
220f0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
22100 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
22110 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
22120 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
22130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22140 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
22150 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
22160 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
22170 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
22180 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
22190 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
221a0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
221b0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
221c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
221d0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
221e0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
221f0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
22200 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
22210 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
22220 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
22230 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
22240 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
22250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
22260 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
22270 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
22280 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
22290 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
222a0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
222b0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
222c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
222d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
222e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
222f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
22300 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
22310 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
22320 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
22330 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
22340 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
22350 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
22360 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
22370 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
22380 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
22390 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
223a0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
223b0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
223c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
223d0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
223e0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
223f0 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
22400 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
22410 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
22420 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
22430 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
22440 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
22450 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
22460 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
22470 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
22480 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
22490 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
224a0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
224b0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
224c0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
224d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
224e0 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
224f0 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
22500 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
22510 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
22520 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
22530 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
22540 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
22550 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
22560 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
22570 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
22580 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
22590 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
225a0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
225b0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
225c0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
225d0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
225e0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
225f0 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
22600 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
22610 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
22620 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
22630 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
22640 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
22650 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
22660 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
22670 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
22680 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
22690 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
226a0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
226b0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
226c0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
226d0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
226e0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
226f0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22700 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
22710 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
22720 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
22730 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
22740 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
22750 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
22760 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
22770 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22780 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
22790 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
227a0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
227b0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
227c0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
227d0 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
227e0 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
227f0 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
22800 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
22810 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
22820 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
22830 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
22840 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
22850 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
22860 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
22870 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
22880 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
22890 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
228a0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
228b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
228c0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
228d0 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
228e0 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
228f0 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
22900 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
22910 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
22920 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
22930 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
22940 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
22950 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
22960 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
22970 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
22980 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
22990 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
229a0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
229b0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
229c0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
229d0 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
229e0 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
229f0 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
22a00 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
22a10 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
22a20 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
22a30 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
22a40 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
22a50 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
22a60 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
22a70 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
22a80 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
22a90 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
22aa0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
22ab0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
22ac0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
22ad0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
22ae0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
22af0 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
22b00 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
22b10 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
22b20 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
22b30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22b40 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
22b50 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
22b80 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
22b90 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bb0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
22bc0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
22bd0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
22c00 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
22c10 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
22c20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22c30 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
22c40 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
22c50 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
22c60 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
22c70 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
22ca0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
22cb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22cc0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
22cd0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
22ce0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
22cf0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
22d00 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
22d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22d20 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
22d30 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
22d40 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
22d50 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
22d60 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
22d70 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
22d80 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
22d90 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
22da0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
22db0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
22dc0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
22dd0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
22de0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
22df0 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
22e00 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
22e10 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
22e20 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
22e30 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
22e40 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
22e50 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
22e60 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
22e70 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
22e80 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
22e90 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
22ea0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
22eb0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
22ec0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22ed0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
22ee0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
22ef0 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
22f00 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
22f10 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
22f20 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
22f30 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
22f40 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
22f50 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
22f60 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
22f70 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
22f80 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
22f90 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
22fa0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
22fb0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22fc0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
22fd0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
22fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
22ff0 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
23000 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
23010 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23020 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
23030 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
23040 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
23050 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
23060 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
23070 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
23080 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
23090 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
230a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
230b0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
230c0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
230d0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
230e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
230f0 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
23100 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
23110 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
23120 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
23130 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
23140 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
23150 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
23160 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
23170 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
23180 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
23190 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
231a0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
231b0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
231c0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
231d0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
231e0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
231f0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
23200 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
23210 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
23220 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
23230 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
23240 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
23250 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
23260 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
23270 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
23280 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
23290 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
232a0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
232b0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
232c0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
232d0 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
232e0 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
232f0 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
23300 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
23310 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
23320 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
23330 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
23340 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
23350 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
23360 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
23370 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
23380 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
23390 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
233a0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
233b0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
233c0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
233d0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
233e0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
233f0 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
23400 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
23410 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23420 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
23460 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23490 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
234a0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
234b0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
234e0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
234f0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
23500 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
23510 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
23520 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23530 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
23540 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
23550 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
23560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23570 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
23580 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
23590 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
235a0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
235b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
235c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
235d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
235e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
235f0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
23600 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
23610 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
23620 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
23630 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23640 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
23650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23660 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
23670 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
23680 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
23690 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
236a0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
236b0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
236c0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
236d0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
236e0 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
236f0 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
23700 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
23710 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
23720 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
23730 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
23740 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
23750 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
23760 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
23770 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
23780 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
23790 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
237a0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
237b0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
237c0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
237d0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
237e0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
237f0 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
23800 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
23810 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
23820 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
23830 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
23840 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
23850 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
23860 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
23870 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
23880 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
23890 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
238a0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
238b0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
238c0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
238d0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
238e0 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
238f0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
23900 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
23910 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
23920 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23930 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
23940 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
23950 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
23960 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
23970 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
23980 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
23990 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
239a0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
239b0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
239c0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
239d0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
239e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
239f0 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
23a00 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
23a10 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
23a20 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
23a30 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
23a40 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
23a50 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
23a60 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
23a70 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
23a80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23a90 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
23aa0 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
23ab0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
23ac0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
23ad0 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
23ae0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
23af0 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
23b00 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
23b10 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
23b20 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
23b30 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
23b40 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
23b50 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
23b60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
23b70 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
23b80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
23b90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23ba0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
23bb0 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
23bc0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
23bd0 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
23be0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
23bf0 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
23c00 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
23c10 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
23c20 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
23c30 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
23c40 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
23c50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23c60 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
23c70 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
23c80 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
23c90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
23ca0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
23cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23cc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23cd0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
23ce0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
23cf0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
23d00 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
23d10 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
23d20 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
23d30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
23d40 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
23d50 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
23d60 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
23d70 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
23d80 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
23d90 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
23da0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
23db0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
23dc0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
23dd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
23de0 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
23df0 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
23e00 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
23e10 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
23e20 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
23e30 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
23e40 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
23e50 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
23e60 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
23e70 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
23e80 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
23e90 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23ea0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
23eb0 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
23ec0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
23ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
23ee0 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
23ef0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
23f00 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
23f10 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
23f20 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
23f30 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
23f40 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
23f50 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
23f60 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
23f70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23f80 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
23f90 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
23fa0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
23fb0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
23fc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
23fd0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
23fe0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
23ff0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
24000 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
24010 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
24020 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
24030 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
24040 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
24050 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
24060 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
24070 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
24080 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
24090 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
240a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
240b0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
240c0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
240d0 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
240e0 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
240f0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
24100 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
24110 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
24120 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
24130 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
24140 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
24150 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
24160 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
24170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24180 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
24190 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
241a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
241b0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
241c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
241d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
241e0 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
241f0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
24200 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
24210 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
24220 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
24230 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
24240 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
24250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24260 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
24270 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
24280 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
24290 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
242a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
242b0 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
242c0 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
242d0 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
242e0 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
242f0 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
24300 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
24310 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
24320 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
24330 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
24340 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24350 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
24360 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
24370 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
24380 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24390 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
243a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
243b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
243c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
243d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
243e0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
243f0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
24400 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
24410 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
24420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24430 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
24440 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
24450 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
24460 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
24470 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24480 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
24490 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
244a0 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
244b0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
244c0 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
244d0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
244e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
244f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24500 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
24510 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
24520 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
24530 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
24540 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
24550 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
24560 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
24570 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
24580 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
24590 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
245a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
245b0 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
245c0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
245d0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
245e0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
245f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24600 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24610 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24620 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24630 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
24640 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
24650 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
24660 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  oad;.}../*.** Gi
24670 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
24680 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
24690 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
246a0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
246b0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
246c0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
246d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
246e0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
246f0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
24700 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
24710 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
24720 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
24730 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
24740 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
24750 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
24760 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
24770 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
24780 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
24790 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
247a0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
247b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
247c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
247d0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
247e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
247f0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24800 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
24810 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
24820 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
24830 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
24840 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
24850 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
24860 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
24870 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
24880 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
24890 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
248a0 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
248b0 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
248c0 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
248d0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
248e0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
248f0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
24900 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24910 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
24920 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
24930 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
24940 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
24950 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
24960 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
24970 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
24980 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
24990 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
249a0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
249b0 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
249c0 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
249d0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
249e0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
249f0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
24a00 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
24a10 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
24a20 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
24a30 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
24a40 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
24a50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
24a60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
24a70 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a90 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
24aa0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
24ab0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
24ac0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
24ad0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
24ae0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
24af0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
24b00 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
24b10 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
24b20 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24b30 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
24b40 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
24b50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24b60 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
24b70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
24b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24b90 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
24ba0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
24bb0 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
24bc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24bd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
24be0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
24bf0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
24c00 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
24c10 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
24c20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
24c30 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
24c40 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
24c50 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
24c60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24c70 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
24c80 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
24c90 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
24ca0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
24cb0 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
24cc0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
24cd0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
24ce0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
24cf0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
24d00 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
24d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
24d20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
24d30 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
24d40 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
24d50 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
24d60 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
24d70 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
24d80 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
24d90 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
24da0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
24db0 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
24dc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24dd0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
24de0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
24df0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
24e00 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
24e10 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
24e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
24e30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
24e40 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
24e50 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
24e60 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
24e70 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
24e80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24e90 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
24ea0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24eb0 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
24ec0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
24ed0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
24ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24ef0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
24f00 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
24f10 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
24f20 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
24f30 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
24f40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
24f50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
24f60 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
24f70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24f80 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
24f90 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
24fa0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
24fb0 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
24fc0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
24fd0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
24fe0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
24ff0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
25000 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
25010 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
25020 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
25030 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
25040 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
25050 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
25060 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
25070 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
25080 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
25090 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
250a0 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
250b0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
250c0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
250d0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
250e0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
250f0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
25100 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
25110 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
25120 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
25130 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
25140 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
25150 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
25160 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
25170 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
25180 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
25190 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
251a0 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
251b0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
251c0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
251d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
251e0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
251f0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
25200 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
25210 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
25220 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
25230 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
25240 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
25250 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
25260 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
25270 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
25280 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
25290 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
252a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
252b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
252c0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
252d0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
252e0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
252f0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
25300 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
25310 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
25320 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
25330 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
25340 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
25350 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
25360 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
25370 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
25380 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
25390 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
253a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
253b0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
253c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
253d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
253e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
253f0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
25400 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
25410 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
25420 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
25430 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
25440 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
25450 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
25460 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
25470 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
25480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25490 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
254a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
254b0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
254c0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
254d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
254e0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
254f0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
25500 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
25510 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
25520 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
25530 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
25540 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
25550 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
25560 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
25570 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
25580 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
25590 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
255a0 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
255b0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
255c0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
255d0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
255e0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
255f0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
25600 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
25610 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
25620 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
25630 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
25640 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
25650 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
25660 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
25670 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
25680 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
25690 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
256a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
256b0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
256c0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
256d0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
256e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
256f0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
25700 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
25710 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
25720 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74  ly populate.** t
25730 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
25740 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
25750 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
25760 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
25770 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
25780 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
25790 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
257a0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
257b0 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
257c0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
257d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
257e0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
257f0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25800 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20  , it must be.** 
25810 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
25820 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
25830 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
25840 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
25850 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
25860 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
25870 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
25880 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
25890 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
258a0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
258b0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
258c0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
258d0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
258e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
258f0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
25900 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
25910 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
25920 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
25930 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
25940 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
25950 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
25960 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
25970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
25980 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
25990 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
259a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
259b0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
259c0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
259d0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
259e0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
259f0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
25a00 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
25a10 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
25a20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
25a30 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
25a40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
25a50 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
25a60 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
25a70 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
25a80 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
25a90 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
25aa0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
25ab0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
25ac0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
25ad0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
25ae0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25af0 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
25b00 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
25b10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
25b20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
25b30 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
25b40 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
25b50 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
25b60 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
25b90 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
25ba0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
25bb0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
25bc0 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
25bd0 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
25be0 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
25bf0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
25c00 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75   original out bu
25c10 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ffer */.#endif..
25c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
25c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  );.  assert( eOp
25c40 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b  ==0 || eOp==1 );
25c50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25c60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25c70 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
25c80 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25c90 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
25ca0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
25cb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25cc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25cd0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25ce0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
25cf0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
25d00 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74  ayload;.  assert
25d10 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
25d20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
25d30 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  oad );..  assert
25d40 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61  ( aPayload > pPa
25d50 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69  ge->aData );.  i
25d60 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f  f( (uptr)(aPaylo
25d70 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74  ad - pPage->aDat
25d80 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c  a) > (pBt->usabl
25d90 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e  eSize - pCur->in
25da0 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  fo.nLocal) ){.  
25db0 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
25dc0 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
25dd0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
25de0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
25df0 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63  r.  The.    ** c
25e00 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
25e10 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20   is really:.    
25e20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b  **    &aPayload[
25e30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25e40 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
25e50 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
25e60 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69  ze].    ** but i
25e70 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74  s recast into it
25e80 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74  s current form t
25e90 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20  o avoid integer 
25ea0 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d  overflow problem
25eb0 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  s.    */.    ret
25ec0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25ed0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25ee0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
25ef0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
25f00 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
25f10 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
25f20 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
25f30 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
25f40 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
25f50 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
25f60 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
25f70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
25f80 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
25f90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
25fa0 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
25fb0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
25fc0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
25fd0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
25fe0 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
25ff0 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
26000 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
26010 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
26020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
26030 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
26040 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
26050 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26060 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
26070 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
26080 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
26090 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
260a0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
260b0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
260c0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
260d0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
260e0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
260f0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
26100 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
26110 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
26120 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
26130 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
26140 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
26150 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
26160 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
26170 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
26180 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
26190 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
261a0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
261b0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
261c0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
261d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
261e0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
261f0 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
26200 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
26210 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
26220 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
26230 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
26240 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
26250 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
26260 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
26270 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
26280 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
26290 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
262a0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
262b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
262c0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
262d0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
262e0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
262f0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
26300 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
26310 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c  Ovfl>pCur->nOvfl
26320 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
26330 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
26340 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  gno*)sqlite3Real
26350 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
26360 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26370 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
26380 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
26390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
263a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
263b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
263c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
263d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
263e0 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66        pCur->nOvf
263f0 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32  lAlloc = nOvfl*2
26400 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
26410 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e  ->aOverflow = aN
26420 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
26430 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
26440 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
26450 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
26460 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
26470 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
26480 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
26490 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fl;.    }else{. 
264a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
264b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
264c0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
264d0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
264e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  he.      ** entr
264f0 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
26500 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
26510 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
26520 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64   skip.      ** d
26530 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
26540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
26550 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
26560 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
26570 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  e] ){.        iI
26580 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
26590 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  lSize);.        
265a0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
265b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
265c0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
265d0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
265e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
265f0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
26600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26610 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77  & amt>0 );.    w
26620 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29  hile( nextPage )
26630 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  {.      /* If re
26640 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
26650 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
26660 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
26670 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
26680 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26690 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20  iIdx]==0.       
266a0 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e         || pCur->
266b0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
266c0 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20  =nextPage.      
266d0 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55          || CORRU
266e0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70  PT_DB );.      p
266f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26700 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
26710 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
26720 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
26730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
26740 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
26750 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
26760 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
26770 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
26780 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
26790 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
267a0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
267b0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
267c0 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
267d0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
267e0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
267f0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
26800 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
26810 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
26820 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
26830 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
26840 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
26850 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
26860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26870 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
26880 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26890 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20  lidOvfl );.     
268a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
268b0 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74  >pBtree->db==pBt
268c0 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20  ->db );.        
268d0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
268e0 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
268f0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
26900 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
26910 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
26920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26930 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
26940 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
26950 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
26960 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
26970 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
26980 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
26990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
269a0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
269b0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
269c0 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
269d0 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
269e0 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
269f0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
26a00 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
26a10 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
26a20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
26a30 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
26a40 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
26a50 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
26a60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
26a70 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66  ;      /* File f
26a80 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20  rom which to do 
26a90 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20  direct overflow 
26aa0 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  read */.#endif. 
26ab0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
26ac0 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
26ad0 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
26ae0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
26af0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
26b00 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
26b10 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
26b20 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
26b30 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
26b40 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
26b50 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
26b60 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
26b70 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
26b80 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
26b90 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
26ba0 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
26bb0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
26bc0 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
26bd0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
26be0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
26bf0 2a 20 20 20 33 29 20 74 68 65 72 65 20 69 73 20  *   3) there is 
26c00 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72  no open write-tr
26c10 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
26c20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
26c30 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
26c40 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
26c50 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
26c60 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
26c70 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a  in the WAL file.
26c80 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
26c90 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
26ca0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
26cb0 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  en read into the
26cc0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a   output buffer .
26cd0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26ce0 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
26cf0 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
26d00 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
26d10 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
26d20 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
26d30 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
26d40 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
26d50 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
26d60 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
26d70 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
26d80 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
26d90 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
26da0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
26db0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
26dc0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30        if( eOp==0
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e00 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
26e10 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
26e50 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
26e60 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
26e70 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e90 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
26ea0 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
26eb0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
26ec0 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
26ed0 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a  ods     /* (4) *
26ee0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  /.         && 0=
26ef0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65  =sqlite3PagerUse
26f00 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
26f10 20 6e 65 78 74 50 61 67 65 29 20 20 20 20 20 20   nextPage)      
26f20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
26f30 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
26f40 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
26f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26f80 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
26f90 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
26fa0 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
26fb0 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
26fc0 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
26fd0 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ff0 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f         /* due to
27000 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
27010 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
27020 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
27030 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27040 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
27050 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
27060 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
27070 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
27080 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
27090 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
270a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
270b0 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
270c0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
270d0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
270e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
270f0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
27100 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27110 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
27120 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
27130 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
27140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27150 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f  (eOp==0 ? PAGER_
27160 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
27170 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
27180 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
27190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
271a0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
271b0 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
271c0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
271d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
271e0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
271f0 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
27200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
27210 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
27220 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
27230 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
27240 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
27250 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
27260 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
27270 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
27280 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
27290 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
272a0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
272b0 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d          if( amt=
272c0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
272d0 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
272e0 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  a;.      }.     
272f0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
27300 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20  .      iIdx++;. 
27310 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
27320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27330 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
27340 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
27350 55 50 54 5f 42 4b 50 54 3b 20 2f 2a 20 4f 76 65  UPT_BKPT; /* Ove
27360 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73  rflow chain ends
27370 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a   prematurely */.
27380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
273a0 61 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f  art of the paylo
273b0 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61  ad for the row a
273c0 74 20 77 68 69 63 68 20 74 68 61 74 20 63 75 72  t which that cur
273d0 73 6f 72 20 70 43 75 72 20 69 73 20 63 75 72 72  sor pCur is curr
273e0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
273f0 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73 20  g.  "amt" bytes 
27400 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
27410 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
27420 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
27430 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
27440 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  set"..**.** pCur
27450 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67   can be pointing
27460 20 74 6f 20 65 69 74 68 65 72 20 61 20 74 61 62   to either a tab
27470 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62  le or an index b
27480 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69  -tree..** If poi
27490 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
274a0 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65   btree, then the
274b0 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e   content section
274c0 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a   is read.  If.**
274d0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
274e0 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d  g to an index b-
274f0 74 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65  tree then the ke
27500 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61  y section is rea
27510 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c  d..**.** For sql
27520 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
27530 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  (), the caller m
27540 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
27550 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
27560 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72  .** to a valid r
27570 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ow in the table.
27580 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72    For sqlite3Btr
27590 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
275a0 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  (), the.** curso
275b0 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c  r might be inval
275c0 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64  id or might need
275d0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20   to be restored 
275e0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61  before being rea
275f0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
27600 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
27610 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
27620 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
27630 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
27640 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
27650 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
27660 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
27670 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
27680 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
27690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
276a0 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72  reePayload(BtCur
276b0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
276c0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
276d0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
276e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
276f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27700 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27710 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27720 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
27730 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
27740 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
27750 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
27760 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27770 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27780 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
27790 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
277a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
277b0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
277c0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
277d0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
277e0 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
277f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
27800 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  nt of sqlite3Btr
27810 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b  eePayload() work
27820 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75  s even if the cu
27830 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  rsor has not.** 
27840 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41  in the CURSOR_VA
27850 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69  LID state.  It i
27860 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  s only used by t
27870 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
27880 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66  read().** interf
27890 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ace..*/.#ifndef 
278a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
278b0 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49  BLOB.static SQLI
278c0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
278d0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
278e0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
278f0 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66   *pCur,.  u32 of
27900 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c  fset,.  u32 amt,
27910 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b  .  void *pBuf.){
27920 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20  .  int rc;.  if 
27930 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27940 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
27950 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27960 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20  ITE_ABORT;.  }. 
27970 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
27980 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
27990 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
279a0 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
279b0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
279c0 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a  return rc ? rc :
279d0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
279e0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
279f0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e  , pBuf, 0);.}.in
27a00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
27a10 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43  yloadChecked(BtC
27a20 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27a30 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
27a40 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
27a50 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
27a60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27a70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  ){.    assert( c
27a80 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
27a90 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72  d(pCur) );.    r
27aa0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
27ab0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
27ac0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
27ad0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
27ae0 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
27af0 61 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20  adChecked(pCur, 
27b00 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
27b10 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
27b20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
27b30 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
27b40 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
27b50 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
27b60 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
27b70 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
27b80 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
27b90 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
27ba0 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
27bb0 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
27bc0 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
27bd0 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
27be0 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
27bf0 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
27c00 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
27c10 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
27c20 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
27c30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
27c40 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
27c50 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
27c60 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
27c70 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
27c80 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
27c90 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
27ca0 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
27cb0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
27cc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
27cd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
27ce0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
27cf0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
27d00 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
27d10 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
27d20 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
27d30 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
27d40 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
27d50 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
27d60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
27d70 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
27d80 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
27d90 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
27da0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
27db0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
27dc0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
27dd0 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
27de0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
27df0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
27e00 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
27e10 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
27e20 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
27e30 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
27e40 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
27e50 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
27e60 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
27e70 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
27e80 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
27e90 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
27ea0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
27eb0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
27ec0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
27ed0 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
27ee0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
27ef0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
27f00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
27f10 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
27f20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
27f30 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
27f40 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
27f50 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
27f60 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
27f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
27f80 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
27f90 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
27fa0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
27fb0 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  32 amt;.  assert
27fc0 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
27fd0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27fe0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27ff0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
28000 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28010 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
28030 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28040 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
28050 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
28060 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28070 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28090 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
280a0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
280b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
280c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
280d0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
280e0 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ize>0 );.  asser
280f0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
28100 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50  ayload>pCur->apP
28110 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28120 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
28130 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
28140 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
28150 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50  ayload<pCur->apP
28160 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28170 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
28180 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
28190 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70  = (int)(pCur->ap
281a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
281b0 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  ]->aDataEnd - pC
281c0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
281d0 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  d);.  if( pCur->
281e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20  info.nLocal<amt 
281f0 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  ) amt = pCur->in
28200 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41  fo.nLocal;.  *pA
28210 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75  mt = amt;.  retu
28220 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
28230 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
28240 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
28250 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
28260 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
28270 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
28280 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
28290 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
282a0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
282b0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
282c0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
282d0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
282e0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
282f0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
28300 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
28310 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
28320 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
28330 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
28340 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
28350 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
28360 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
28370 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
28380 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
28390 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
283a0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
283b0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
283c0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
283d0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
283e0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
283f0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
28400 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
28410 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
28420 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
28430 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
28440 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
28450 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
28460 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
28470 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
28480 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
28490 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
284a0 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72  yloadFetch(BtCur
284b0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
284c0 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
284d0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
284e0 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
284f0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
28500 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
28510 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
28520 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
28530 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
28540 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
28550 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
28560 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
28570 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28580 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
28590 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
285a0 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
285b0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
285c0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
285d0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
285e0 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
285f0 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
28600 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
28610 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
28620 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
28630 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
28640 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
28650 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
28660 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
28670 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28680 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42  32 newPgno){.  B
28690 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
286a0 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
286b0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
286c0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
286d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
286e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
286f0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
28700 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
28710 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
28720 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
28730 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
28740 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
28750 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
28760 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
28770 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28780 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28790 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  }.  pCur->info.n
287a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
287b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
287c0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
287d0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
287e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
287f0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
28800 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b  Cur->iPage] = 0;
28810 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64  .  return getAnd
28820 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
28830 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70  wPgno, &pCur->ap
28840 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28850 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
28860 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c             pCur,
28870 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
28880 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  lags);.}..#ifdef
28890 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
288a0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
288b0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
288c0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
288d0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
288e0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
288f0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
28900 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
28910 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
28920 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
28930 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
28940 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
28950 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
28960 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
28970 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
28980 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
28990 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
289a0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
289b0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
289c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
289d0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
289e0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
289f0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
28a00 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
28a10 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
28a20 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
28a30 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
28a40 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
28a50 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
28a80 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
28a90 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
28aa0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
28ab0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
28ac0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
28ad0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
28ae0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
28af0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
28b00 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
28b10 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
28b20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
28b30 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
28b40 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
28b50 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
28b60 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
28b70 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
28b80 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
28b90 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28ba0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
28bb0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
28bc0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
28bd0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
28be0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
28bf0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
28c00 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
28c10 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
28c20 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
28c30 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
28c40 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
28c50 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
28c60 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
28c70 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
28c80 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
28c90 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
28ca0 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
28cb0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
28cc0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
28cd0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28ce0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
28cf0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28d00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28d20 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
28d30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
28d40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28d50 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
28d60 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
28d70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28d80 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
28d90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28da0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
28db0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28dc0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
28dd0 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
28de0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
28df0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
28e00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28e10 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
28e20 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
28e30 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
28e40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28e50 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
28e60 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
28e70 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
28e80 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
28e90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28ea0 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
28eb0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
28ec0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
28ed0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
28ee0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
28ef0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
28f00 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
28f10 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
28f20 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
28f30 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
28f40 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
28f50 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
28f60 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
28f70 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
28f80 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
28f90 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
28fa0 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
28fb0 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
28fc0 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
28fd0 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
28fe0 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
28ff0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
29000 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
29010 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
29020 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
29030 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
29040 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
29050 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
29060 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
29070 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
29080 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
29090 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
290a0 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
290b0 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
290c0 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
290d0 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
290e0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
290f0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
29100 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
29110 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
29120 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
29130 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
29140 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
29150 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
29160 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
29170 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
29180 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
29190 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
291a0 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
291b0 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
291c0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
291d0 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
291e0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
291f0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
29200 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
29210 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
29220 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
29230 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
29240 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
29250 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
29260 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
29270 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
29280 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
29290 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
292a0 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
292b0 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
292c0 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
292d0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
292e0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
292f0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
29300 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
29310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
29320 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29330 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
29350 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
29360 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29370 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
29380 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
29390 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
293a0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
293b0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
293c0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
293d0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
293e0 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
293f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
29400 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
29410 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
29420 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
29430 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
29440 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
29450 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
29460 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
29470 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29480 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
29490 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
294a0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
294b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  0 ){.    if( pCu
294c0 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20  r->iPage ){.    
294d0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73    do{.        as
294e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
294f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21  ge[pCur->iPage]!
29500 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =0 );.        re
29510 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
29520 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
29530 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20  ur->iPage--]);. 
29540 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75       }while( pCu
29550 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20  r->iPage);.     
29560 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b   goto skip_init;
29570 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
29580 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
29590 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
295a0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
295b0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
295c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
295d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
295e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
295f0 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72  e==(-1) );.    r
29600 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
29610 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ge(pCur->pBtree-
29620 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
29630 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
29640 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  age[0],.        
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  0, pCur->curPage
29670 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  rFlags);.    if(
29680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29690 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
296a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
296b0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65  VALID;.       re
296c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
296d0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
296e0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
296f0 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
29700 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
29710 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
29720 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
29730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
29740 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
29750 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
29760 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
29770 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
29780 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
29790 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
297a0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
297b0 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
297c0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
297d0 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
297e0 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
297f0 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
29800 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
29810 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
29820 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
29830 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
29840 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
29850 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
29860 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
29870 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
29880 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
29890 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
298a0 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
298b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
298c0 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
298d0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
298e0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
298f0 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
29900 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
29910 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
29920 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
29930 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
29940 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
29950 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
29960 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
29970 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
29980 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
29990 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
299a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
299b0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
299c0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
299d0 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
299e0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
299f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
29a00 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
29a10 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
29a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29a30 4b 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69  KPT;.  }..skip_i
29a40 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 61  nit:  .  pCur->a
29a50 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
29a60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
29a70 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
29a80 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
29a90 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
29aa0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
29ab0 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20  Ovfl);..  pRoot 
29ac0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
29ad0 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ];.  if( pRoot->
29ae0 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
29af0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29b00 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
29b10 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
29b20 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
29b30 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
29b40 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
29b50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29b60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29b70 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
29b80 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
29b90 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
29ba0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
29bb0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29bc0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
29bd0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29be0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
29bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
29c00 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29c10 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
29c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29c30 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
29c40 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
29c50 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29c60 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29c70 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
29c80 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
29c90 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
29ca0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
29cb0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
29cc0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
29cd0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
29ce0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
29cf0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
29d00 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29d10 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
29d20 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
29d30 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
29d40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
29d50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
29d60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29d70 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29d80 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29d90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29da0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29db0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29dc0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
29dd0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29de0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29df0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
29e00 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29e10 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
29e20 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
29e30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
29e40 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
29e50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29e60 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
29e70 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29e80 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
29e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29ea0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29eb0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
29ec0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
29ed0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
29ee0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
29ef0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
29f00 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
29f10 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
29f20 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
29f30 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
29f40 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
29f50 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
29f60 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
29f70 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
29f80 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
29f90 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
29fa0 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
29fb0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
29fc0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
29fd0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29fe0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
29ff0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2a000 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
2a010 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2a020 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
2a030 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
2a040 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2a050 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
2a060 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
2a070 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
2a080 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
2a090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2a0a0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2a0b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2a0c0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2a0d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2a0e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2a0f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2a100 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2a110 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2a120 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
2a130 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2a140 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2a150 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2a160 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2a170 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a180 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2a190 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2a1a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2a1b0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2a1c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2a1d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2a1e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a1f0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
2a200 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2a210 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2a220 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2a230 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2a240 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2a250 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2a260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a270 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2a280 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2a290 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2a2a0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2a2b0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2a2c0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2a2d0 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2a2e0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2a2f0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2a300 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2a310 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2a320 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2a330 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2a340 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2a350 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2a360 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2a370 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2a380 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2a390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a3a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2a3b0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2a3c0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
2a3d0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2a3e0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2a3f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a400 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2a410 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2a420 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
2a430 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2a440 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2a450 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a460 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2a470 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a490 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2a4a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a4b0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
2a4c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2a4d0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2a4e0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2a4f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2a510 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a520 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a530 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2a540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2a550 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2a560 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2a570 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2a580 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2a590 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2a5a0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2a5b0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2a5c0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2a5d0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
2a5e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2a5f0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2a600 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
2a610 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2a620 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2a630 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a640 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2a650 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2a660 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2a670 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
2a680 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
2a690 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
2a6a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
2a6b0 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
2a6c0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a6d0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2a6e0 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2a6f0 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
2a700 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2a710 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
2a720 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
2a730 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2a740 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2a750 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2a760 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2a770 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2a780 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2a790 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2a7a0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2a7b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a7c0 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2a7d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2a7e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2a7f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a800 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a810 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
2a820 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a830 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2a840 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2a850 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a860 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
2a870 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
2a880 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
2a890 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2a8a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2a8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a8c0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2a8d0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2a8e0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
2a8f0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2a900 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2a910 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a920 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2a930 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a950 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a960 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a970 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
2a980 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
2a990 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2a9a0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
2a9b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a9c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
2a9d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2a9e0 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2a9f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2aa00 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2aa10 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2aa20 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
2aa30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2aa40 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2aa50 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2aa60 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2aa70 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2aa80 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2aa90 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2aaa0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2aab0 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2aac0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2aad0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2aae0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2aaf0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2ab00 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2ab10 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2ab20 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2ab30 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2ab40 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2ab50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2ab60 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2ab70 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2ab80 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2ab90 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2aba0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2abb0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2abc0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2abd0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2abe0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2abf0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2ac00 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2ac10 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2ac20 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2ac30 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2ac40 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2ac50 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2ac60 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2ac70 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2ac80 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2ac90 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2aca0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2acb0 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2acc0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2acd0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2ace0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2acf0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2ad00 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2ad10 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2ad20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2ad30 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2ad50 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2ad60 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2ad70 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2ad80 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2ad90 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2ada0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2adb0 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2adc0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2add0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2ade0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2adf0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2ae00 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2ae10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2ae20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2ae30 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2ae40 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2ae50 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2ae60 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2ae70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2ae80 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2aea0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2aeb0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2aec0 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2aed0 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2aee0 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2aef0 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2af00 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2af10 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2af20 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2af30 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2af40 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2af50 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2af60 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2af70 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2af80 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2af90 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2afa0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2afb0 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2afc0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2afd0 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aff0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2b000 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2b010 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2b020 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2b030 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2b040 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2b050 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2b060 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2b070 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2b080 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2b090 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2b0a0 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2b0b0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b0c0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b0d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b0e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b0f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2b100 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2b110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2b120 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2b130 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2b140 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2b150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b160 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2b170 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2b180 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2b190 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2b1a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2b1b0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2b1c0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2b1d0 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2b1e0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2b1f0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2b200 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2b210 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2b220 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2b230 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2b240 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2b250 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2b260 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2b270 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2b280 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2b290 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2b2a0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2b2b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2b2c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b2d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2b2e0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2b2f0 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2b300 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2b310 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2b320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2b330 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2b340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b350 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2b360 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2b370 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2b380 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2b390 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2b3a0 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2b3b0 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2b3c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2b3d0 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2b3e0 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2b3f0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2b400 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2b410 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2b420 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2b430 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2b440 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2b450 68 6f 75 74 20 74 68 69 73 20 61 73 65 2c 20 6f  hout this ase, o
2b460 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72  nly a little mor
2b470 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20  e slowely */.   
2b480 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2b490 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79  o.nKey+1==intKey
2b4a0 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e   && !pCur->skipN
2b4b0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ext ){.        *
2b4c0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2b4d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2b4e0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2b4f0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
2b500 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b510 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 52  .        if( *pR
2b520 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
2b530 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
2b540 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2b550 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2b560 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2b570 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2b580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2b590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b5a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2b5b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2b5c0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2b5d0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2b5e0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2b5f0 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2b600 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2b610 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2b620 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2b630 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2b640 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2b650 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2b660 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2b670 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2b680 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2b690 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2b6a0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2b6b0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2b6c0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2b6d0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2b6e0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2b6f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b700 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b710 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2b720 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2b730 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2b740 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b750 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2b760 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b770 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2b780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b790 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b7a0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2b7b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b7c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2b7d0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2b7e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2b7f0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2b800 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2b810 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2b820 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2b830 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b840 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2b850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2b870 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2b880 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2b890 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2b8a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b8b0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2b8c0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2b8d0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2b8e0 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2b8f0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2b900 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2b910 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b920 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2b930 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b960 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2b970 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2b980 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2b990 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2b9a0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2b9b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2b9c0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2b9d0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2b9e0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2b9f0 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2ba00 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2ba10 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2ba20 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2ba30 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2ba40 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2ba50 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2ba60 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2ba70 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2ba80 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2ba90 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2baa0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2bab0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2bac0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2bad0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2bae0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2baf0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2bb00 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2bb10 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2bb20 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2bb30 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2bb40 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2bb50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2bb60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2bb70 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2bb80 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2bb90 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2bba0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2bbb0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2bbc0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2bbd0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2bbe0 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2bbf0 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2bc00 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2bc10 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2bc20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2bc30 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2bc40 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2bc50 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2bc60 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2bc70 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2bc80 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2bc90 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2bca0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2bcb0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2bcc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2bcd0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2bce0 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2bcf0 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2bd00 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2bd10 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2bd20 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
2bd30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2bd40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2bd60 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2bd70 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2bd80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2bd90 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2bda0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2bdb0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2bdc0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2bdd0 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2bde0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2bdf0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2be00 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2be10 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2be20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2be30 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2be40 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2be50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2be60 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2be70 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2be80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2be90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2bea0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2beb0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2bec0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2bed0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
2bee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2bef0 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
2bf00 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
2bf10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2bf20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2bf30 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2bf40 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2bf50 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2bf60 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2bf70 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2bf80 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2bf90 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2bfa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2bfb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bfc0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2bfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bfe0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2bff0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2c000 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2c010 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2c020 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2c030 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2c040 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2c050 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2c060 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2c070 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2c080 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2c090 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c0a0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2c0b0 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2c0c0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2c0d0 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2c0e0 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2c0f0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2c100 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2c110 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2c120 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2c130 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2c140 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2c150 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2c160 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2c170 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2c180 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2c190 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2c1a0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2c1b0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2c1c0 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2c1d0 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2c1e0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2c1f0 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2c200 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2c210 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2c220 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2c230 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2c240 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2c250 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2c260 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2c270 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2c280 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2c290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c2a0 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2c2b0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2c2c0 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2c2d0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2c2e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2c2f0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2c300 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2c310 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2c320 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2c330 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2c340 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2c350 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2c360 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2c370 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2c380 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2c390 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c3a0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2c3b0 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2c3c0 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2c3d0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2c3e0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2c3f0 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2c400 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2c410 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2c420 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2c430 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2c440 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2c450 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2c460 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2c470 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2c480 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2c490 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2c4a0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2c4b0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2c4c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2c4d0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2c4e0 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2c4f0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2c500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2c510 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2c520 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2c530 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c540 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c550 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2c560 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2c570 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c590 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2c5a0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2c5b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2c5c0 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2c5d0 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2c5e0 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2c5f0 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2c600 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2c610 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2c620 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2c630 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2c640 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2c650 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2c660 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2c670 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2c680 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2c690 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2c6a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2c6b0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2c6c0 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2c6d0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2c6e0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2c6f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2c700 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2c710 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2c720 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2c730 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2c740 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2c750 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2c760 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2c770 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2c780 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2c790 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2c7a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2c7b0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2c7c0 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2c7d0 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2c7e0 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2c7f0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2c800 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2c810 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2c820 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2c830 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2c840 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2c850 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2c860 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c870 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2c880 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2c890 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2c8a0 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2c8b0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2c8c0 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2c8d0 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2c8e0 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2c8f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c900 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2c910 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2c920 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2c930 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2c940 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2c950 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2c960 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2c970 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2c980 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2c990 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2c9a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2c9b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c9c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c9d0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c9f0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2ca00 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2ca10 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2ca20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2ca30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ca40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2ca50 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2ca60 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ca70 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2ca80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2ca90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2caa0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2cab0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2cac0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2cad0 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2cae0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2caf0 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
2cb00 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2cb10 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2cb20 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
2cb30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2cb50 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2cb60 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2cb70 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2cb80 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2cb90 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2cba0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2cbb0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2cbc0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2cbd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2cbe0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2cbf0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2cc00 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2cc10 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2cc20 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2cc30 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2cc40 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2cc50 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2cc60 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2cc70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2cc80 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2cc90 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2cca0 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2ccb0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2ccc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ccd0 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2cce0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2ccf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cd00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2cd10 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2cd20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2cd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2cd40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2cd50 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2cd60 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2cd70 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2cd80 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2cd90 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2cda0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
2cdb0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2cdc0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2cdd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2cde0 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2cdf0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ce00 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2ce10 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2ce20 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2ce30 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2ce40 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2ce50 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2ce60 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2ce70 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2ce80 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2ce90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2cea0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2ceb0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2cec0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ced0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2cee0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
2cef0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2cf00 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2cf10 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2cf20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2cf30 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2cf40 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
2cf50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2cf60 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
2cf70 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
2cf80 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
2cf90 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
2cfa0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2cfb0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2cfc0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2cfd0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2cfe0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2cff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2d000 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2d010 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d020 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2d030 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d040 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2d050 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2d060 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2d070 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2d080 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2d090 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2d0a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2d0b0 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
2d0c0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2d0d0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2d0e0 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  vfl)==0 );.  ret
2d0f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2d100 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2d110 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
2d120 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
2d130 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
2d140 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
2d150 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
2d160 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
2d170 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
2d180 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
2d190 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
2d1a0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
2d1b0 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
2d1c0 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
2d1d0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
2d1e0 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
2d1f0 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
2d200 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2d210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d220 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
2d230 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
2d240 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
2d250 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
2d260 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2d270 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
2d280 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
2d290 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
2d2a0 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
2d2b0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
2d2c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
2d2d0 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
2d2e0 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
2d2f0 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
2d300 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
2d310 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
2d320 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
2d330 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2d340 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2d350 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2d360 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2d370 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2d380 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2d390 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2d3a0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2d3b0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
2d3c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2d3d0 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2d3e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2d3f0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2d400 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2d410 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2d420 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2d430 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2d440 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2d450 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2d460 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2d470 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2d480 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2d490 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2d4a0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2d4b0 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2d4c0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2d4d0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2d4e0 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2d4f0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2d500 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2d510 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2d520 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2d530 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2d540 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2d550 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2d560 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2d570 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2d580 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2d590 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2d5a0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2d5b0 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2d5c0 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2d5d0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2d5e0 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2d5f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2d600 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2d610 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2d620 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2d630 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2d640 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2d650 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2d660 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2d670 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2d680 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2d690 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2d6a0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2d6b0 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2d6c0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2d6d0 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2d6e0 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2d6f0 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2d700 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2d710 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2d720 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2d730 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2d740 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2d750 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2d760 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2d770 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2d780 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2d790 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2d7a0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d7b0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d7c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d7d0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2d7e0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2d7f0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d800 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d810 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2d820 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2d830 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d840 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2d850 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2d860 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d870 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d880 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2d890 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d8a0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2d8b0 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2d8c0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2d8d0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2d8e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d8f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2d900 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d910 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2d920 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2d930 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2d940 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2d950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d960 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2d970 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2d980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2d990 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d9a0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2d9b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d9c0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2d9d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d9e0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2d9f0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2da00 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2da10 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2da20 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2da30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2da40 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2da50 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2da60 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2da70 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2da80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2da90 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2daa0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2dab0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2dac0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2dad0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2dae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2daf0 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2db00 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2db10 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2db20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2db30 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2db40 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2db50 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2db60 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2db70 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2db80 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2db90 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2dba0 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2dbb0 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2dbc0 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2dbd0 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2dbe0 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2dbf0 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2dc00 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2dc10 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2dc20 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2dc30 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2dc40 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2dc50 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2dc60 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2dc70 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2dc80 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2dc90 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2dca0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2dcb0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2dcc0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2dcd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2dce0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2dcf0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2dd00 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2dd10 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2dd20 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2dd30 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2dd40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2dd50 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2dd60 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2dd70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2dd80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2dd90 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2dda0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2ddb0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2ddc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ddd0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2dde0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ddf0 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2de00 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2de10 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2de20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2de30 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2de40 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2de50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2de60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2de70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2de80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2de90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dea0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2deb0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2dec0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2ded0 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2dee0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2def0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2df00 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2df10 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2df20 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2df30 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2df40 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2df50 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2df60 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2df70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2df80 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2df90 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2dfa0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2dfb0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2dfc0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2dfd0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2dfe0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2dff0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2e000 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
2e010 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2e020 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2e030 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2e040 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70  pCur, pRes);.  p
2e050 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e060 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e070 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2e080 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e090 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ge])>=pPage->nCe
2e0a0 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2e0b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e0c0 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  e]--;.    return
2e0d0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2e0e0 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66   pRes);.  }.  if
2e0f0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2e100 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e110 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2e120 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e130 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2e150 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2e160 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2e170 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2e180 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2e190 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2e1a0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2e1b0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2e1c0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2e1d0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2e1e0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2e1f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2e200 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2e210 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2e220 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2e230 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2e240 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2e250 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2e260 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2e270 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2e280 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2e290 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2e2a0 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
2e2b0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2e2c0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2e2d0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
2e2e0 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
2e2f0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2e300 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2e310 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
2e320 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
2e330 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2e340 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2e350 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2e360 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
2e370 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2e380 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2e390 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2e3a0 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2e3b0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2e3c0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2e3d0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2e3e0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2e3f0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2e400 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2e410 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2e420 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2e430 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2e440 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2e450 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2e460 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2e470 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2e480 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2e490 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2e4a0 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2e4b0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2e4c0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2e4d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e4e0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2e4f0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2e500 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2e510 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2e520 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2e530 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2e540 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2e550 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2e560 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2e570 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2e580 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2e590 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2e5a0 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2e5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2e5c0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2e5d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e5e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e5f0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2e600 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2e610 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2e620 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e630 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2e640 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2e650 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2e660 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e670 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2e680 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2e690 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e6a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2e6b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2e6c0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2e6d0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2e6e0 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2e6f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e700 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2e710 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2e720 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e730 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2e740 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2e750 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2e760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2e780 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e790 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2e7a0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2e7b0 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2e7c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2e7d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e7e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2e7f0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2e800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e810 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e820 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2e830 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2e840 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2e850 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e860 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2e870 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2e880 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2e890 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e8a0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2e8b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e8c0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2e8d0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e8e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2e8f0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e900 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e910 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2e920 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2e930 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e940 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2e950 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2e960 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e970 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2e980 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2e990 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2e9a0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2e9b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e9c0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e9d0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2e9e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2e9f0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2ea00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2ea10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2ea20 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2ea30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2ea40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2ea50 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2ea60 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2ea70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ea80 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2ea90 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2eaa0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2eab0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2eac0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2ead0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2eae0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2eaf0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2eb00 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2eb10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2eb20 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
2eb30 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2eb40 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2eb50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2eb60 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2eb70 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2eb80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2eb90 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2eba0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2ebb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ebc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2ebd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2ebe0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2ebf0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2ec00 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2ec10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2ec20 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ec30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ec40 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2ec50 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2ec60 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2ec70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ec80 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2ec90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2eca0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2ecb0 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2ecc0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2ecd0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2ece0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2ecf0 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2ed00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ed10 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2ed20 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ed30 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2ed40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2ed50 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
2ed60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ed70 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2ed80 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2ed90 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2eda0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2edb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2edc0 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
2edd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ede0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2edf0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
2ee00 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2ee10 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2ee20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
2ee30 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
2ee40 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
2ee50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ee60 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
2ee70 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
2ee80 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
2ee90 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
2eea0 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
2eeb0 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
2eec0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2eed0 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
2eee0 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
2eef0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2ef00 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
2ef10 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2ef20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
2ef30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2ef40 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
2ef50 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
2ef60 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
2ef70 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
2ef80 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2ef90 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
2efa0 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2efb0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2efc0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2efd0 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2efe0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2eff0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2f000 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2f010 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2f020 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2f030 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2f040 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2f050 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2f060 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2f070 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2f080 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2f090 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2f0a0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2f0b0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2f0c0 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2f0d0 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2f0e0 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2f0f0 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2f100 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2f110 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2f120 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2f130 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2f140 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2f150 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2f160 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2f170 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2f180 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2f190 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2f1a0 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2f1b0 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2f1c0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2f1d0 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2f1e0 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2f1f0 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2f200 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2f210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f220 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2f230 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2f240 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2f250 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2f260 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2f270 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2f280 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2f290 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2f2a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2f2b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2f2c0 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2f2d0 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2f2e0 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2f2f0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2f300 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2f310 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2f320 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2f330 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2f340 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2f350 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2f360 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2f370 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2f380 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2f390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f3a0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2f3b0 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2f3c0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2f3d0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2f3e0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2f3f0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2f400 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2f410 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2f420 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2f430 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2f440 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2f450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f460 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2f470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f480 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2f490 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2f4a0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2f4b0 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2f4c0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2f4d0 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2f4e0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2f4f0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2f500 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2f510 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2f520 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2f530 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2f540 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2f550 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2f560 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2f570 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2f580 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f590 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2f5a0 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2f5b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f5c0 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2f5d0 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2f5e0 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2f5f0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2f600 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f610 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2f620 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2f630 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2f640 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2f650 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2f660 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2f670 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2f680 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2f690 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2f6a0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2f6b0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2f6c0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
2f6d0 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
2f6e0 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
2f6f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
2f700 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
2f710 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2f720 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2f730 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2f740 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f750 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2f760 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2f770 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2f780 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2f790 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2f7a0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2f7b0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2f7c0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2f7d0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2f7e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2f7f0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2f800 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2f810 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2f820 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2f830 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2f840 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2f850 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2f860 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f870 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f880 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f890 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2f8a0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2f8b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f8c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f8d0 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2f8e0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2f8f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2f900 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2f910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f920 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2f930 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2f940 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2f950 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2f960 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2f970 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2f980 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2f990 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2f9a0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2f9b0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2f9c0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2f9d0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2f9e0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2f9f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2fa00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fa10 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2fa20 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2fa30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fa40 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2fa50 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2fa60 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2fa70 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2fa80 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2fa90 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2faa0 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2fab0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2fac0 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2fad0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2fae0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2faf0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2fb00 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2fb10 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2fb20 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2fb30 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2fb40 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2fb50 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2fb60 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2fb70 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2fb80 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2fb90 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2fba0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2fbb0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2fbc0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2fbd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2fbe0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2fbf0 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2fc00 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2fc10 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2fc20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2fc30 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2fc40 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2fc50 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2fc60 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2fc70 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2fc80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2fc90 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2fca0 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2fcb0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2fcc0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2fcd0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2fce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fcf0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2fd00 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2fd10 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2fd20 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2fd30 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2fd40 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2fd50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2fd60 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2fd70 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2fd80 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2fd90 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2fda0 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2fdb0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2fdc0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2fdd0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2fde0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2fdf0 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2fe00 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2fe10 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2fe20 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
2fe30 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
2fe40 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2fe50 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2fe60 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2fe70 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2fe80 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2fe90 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2fea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2feb0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2fec0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2fed0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fee0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fef0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2ff00 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2ff10 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2ff20 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2ff30 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2ff40 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2ff50 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2ff60 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2ff70 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2ff80 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2ff90 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2ffa0 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2ffb0 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2ffc0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2ffd0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2ffe0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2fff0 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
30000 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
30010 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
30020 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
30030 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
30040 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
30050 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
30060 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
30070 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
30080 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
30090 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
300a0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
300b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
300c0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
300d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
300e0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
300f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30100 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
30110 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30120 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30140 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
30150 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
30160 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
30170 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
30180 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
30190 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
301a0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
301b0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
301c0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
301d0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
301e0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
301f0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
30200 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
30210 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
30220 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
30230 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
30240 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
30250 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
30260 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
30270 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
30280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30290 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
302a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
302b0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
302c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
302d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
302e0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
302f0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
30300 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
30310 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
30320 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
30330 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
30340 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30350 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
30360 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
30370 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
30380 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
30390 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
303a0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
303b0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
303c0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
303d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
303e0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
303f0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
30400 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
30410 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
30420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30430 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30440 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
30450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
30470 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30480 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
30490 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
304a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
304b0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
304c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
304d0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
304e0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
304f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
30500 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
30510 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30520 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30530 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
30540 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
30550 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30580 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30590 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
305a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
305b0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
305c0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
305d0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
305e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
305f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30600 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
30610 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
30620 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
30630 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
30640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
30650 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
30660 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
30670 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
30680 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
30690 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
306a0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
306b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
306c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
306d0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
306e0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
306f0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
30700 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
30710 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
30720 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
30730 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30740 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
30750 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
30760 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30770 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30790 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
307a0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
307b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
307c0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
307d0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
307e0 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
307f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30810 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
30820 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30830 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
30840 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30850 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30860 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
30870 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
308a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
308b0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
308c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
308d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
308e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
308f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
30900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30910 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
30920 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
30930 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
30940 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
30950 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
30960 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
30970 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
30980 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
30990 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
309a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
309b0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
309c0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
309d0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
309e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
309f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
30a00 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
30a10 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
30a20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
30a30 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30a40 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
30a50 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
30a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30a70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30a80 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
30a90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30aa0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
30ac0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30ad0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30ae0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30af0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
30b00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30b10 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
30b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30b30 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
30b40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
30b50 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
30b60 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
30b70 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
30b80 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
30b90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
30ba0 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
30bb0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
30bc0 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
30bd0 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
30be0 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
30bf0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
30c00 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
30c10 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
30c20 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
30c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
30c40 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
30c50 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
30c60 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
30c70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30c80 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
30c90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
30ca0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
30cb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
30cc0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
30cd0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
30ce0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
30cf0 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
30d00 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
30d10 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30d20 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
30d30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
30d40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30d70 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
30d80 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
30d90 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
30da0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
30db0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
30dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
30dd0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
30de0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30df0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
30e00 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
30e10 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
30e20 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
30e30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
30e40 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
30e50 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
30e60 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
30e70 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
30e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
30e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30ea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30ec0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
30ed0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
30ee0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
30ef0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
30f00 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
30f10 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
30f20 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
30f30 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
30f40 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
30f50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30f60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
30f70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30f80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30fa0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
30fb0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
30fc0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
30fd0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
30fe0 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
30ff0 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
31000 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
31010 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
31020 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
31030 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
31040 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
31050 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
31060 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
31070 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
31080 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
31090 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
310a0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
310b0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
310c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
310d0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
310e0 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
310f0 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
31100 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31110 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
31120 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
31130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31140 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
31150 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31160 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
31170 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
31180 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
31190 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
311a0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
311b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
311c0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
311d0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
311e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
311f0 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
31200 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
31210 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
31220 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
31230 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
31240 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
31250 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
31260 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
31270 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
31280 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
312a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
312b0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
312c0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
312d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
312e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
312f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
31300 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
31310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
31320 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
31330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31350 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
31360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31370 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
31380 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
31390 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
313a0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
313b0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
313c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
313d0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
313e0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
313f0 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
31400 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
31410 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
31420 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
31430 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
31440 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
31450 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
31460 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
31470 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
31480 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
31490 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
314a0 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
314b0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
314c0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
314d0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
314e0 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
314f0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
31500 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
31510 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
31520 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
31530 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
31540 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
31550 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
31560 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
31570 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
31580 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
31590 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
315a0 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
315b0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
315c0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
315d0 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
315e0 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
315f0 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
31600 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
31610 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
31620 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
31630 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
31640 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
31650 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
31660 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
31670 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
31680 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31690 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
316a0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
316b0 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
316c0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
316d0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
316e0 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
316f0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
31700 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
31710 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
31720 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
31730 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
31740 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
31750 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
31760 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
31770 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
31780 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
31790 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
317a0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
317b0 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
317c0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
317d0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
317e0 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
317f0 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
31800 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
31810 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
31820 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
31830 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31840 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
31850 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
31860 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31870 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
31880 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
31890 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
318a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
318b0 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
318c0 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
318d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
318e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
318f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31900 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
31910 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
31920 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
31930 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
31940 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
31950 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
31960 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
31970 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
31980 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
31990 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
319a0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
319b0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
319c0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
319d0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
319e0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
319f0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
31a00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31a10 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
31a20 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
31a30 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
31a40 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
31a50 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
31a60 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
31a70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31a80 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
31a90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31aa0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
31ab0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31ac0 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
31ad0 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
31ae0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
31af0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31b00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31b20 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
31b30 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
31b40 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
31b50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31b60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31b70 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
31b80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
31b90 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
31ba0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31bb0 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
31bc0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
31bd0 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
31be0 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
31bf0 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
31c00 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
31c10 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
31c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
31c30 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
31c40 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
31c50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31c60 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31c70 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
31c80 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
31c90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
31ca0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
31cb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31cc0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
31cd0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
31ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31cf0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31d00 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
31d10 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
31d20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
31d30 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
31d40 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
31d50 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
31d60 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
31d70 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
31d80 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
31d90 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
31da0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
31db0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
31dc0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
31dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
31de0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
31df0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
31e00 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
31e10 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
31e20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31e30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
31e40 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
31e50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31e60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
31e70 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
31e80 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
31e90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31ea0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
31eb0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
31ec0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
31ed0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31ee0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
31ef0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
31f00 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
31f10 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
31f20 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
31f30 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
31f40 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
31f50 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
31f60 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
31f70 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
31f80 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
31f90 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
31fa0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
31fb0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
31fc0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
31fd0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
31fe0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
31ff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
32000 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
32010 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
32020 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
32030 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
32040 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
32050 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
32060 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
32070 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
32080 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
32090 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
320a0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
320b0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
320c0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320e0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
320f0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
32100 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32120 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
32130 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
32140 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
32150 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
32160 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
32170 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
32180 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
32190 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
321a0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
321b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
321c0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
321d0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
321e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32200 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
32210 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
32220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32240 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
32250 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
32260 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
32270 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
32280 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
32290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
322a0 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
322b0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
322c0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
322d0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
322e0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
322f0 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
32300 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32310 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
32320 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
32330 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
32340 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
32350 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
32360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
32370 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
32380 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
32390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
323a0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
323b0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
323c0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
323d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
323e0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
323f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
32400 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32410 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
32420 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32430 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
32440 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32450 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
32460 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
32470 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
32480 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
32490 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
324a0 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
324b0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
324c0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
324d0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
324e0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
324f0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
32500 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
32510 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
32520 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
32530 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
32540 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
32550 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
32560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32570 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
32580 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
32590 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
325a0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
325b0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
325c0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
325d0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
325e0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
325f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
32600 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
32610 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
32620 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
32630 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
32640 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
32650 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
32660 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
32670 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
32680 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
32690 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
326a0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
326b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
326c0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
326d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
326e0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
326f0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
32700 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
32710 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
32720 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
32730 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
32740 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
32750 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
32760 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
32770 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
32780 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
32790 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
327a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
327b0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
327c0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
327d0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
327e0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
327f0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
32800 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
32810 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
32820 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
32830 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
32840 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
32850 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
32860 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
32870 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
32880 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
32890 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
328a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
328b0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
328c0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
328d0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
328e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
328f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32900 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
32910 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
32920 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
32930 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
32940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32950 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
32960 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
32970 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
32980 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32990 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
329a0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
329b0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
329c0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
329d0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
329e0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
329f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32a00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
32a10 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32a20 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
32a30 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
32a40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
32a50 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
32a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32a70 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
32a80 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
32a90 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
32aa0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
32ab0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
32ac0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
32ad0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
32ae0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
32af0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
32b00 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
32b10 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
32b20 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
32b30 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
32b40 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
32b50 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
32b60 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
32b70 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
32b80 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
32b90 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
32ba0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
32bb0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
32bc0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
32bd0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
32be0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
32bf0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
32c00 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
32c10 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
32c20 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
32c30 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
32c40 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
32c50 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
32c60 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
32c70 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
32c80 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
32c90 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
32ca0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
32cb0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
32cc0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
32cd0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
32ce0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
32cf0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
32d00 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
32d10 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
32d20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
32d30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
32d40 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
32d50 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
32d60 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
32d70 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
32d80 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
32d90 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
32da0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
32db0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
32dc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
32dd0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
32de0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
32df0 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
32e00 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
32e10 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
32e20 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
32e30 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
32e40 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
32e50 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
32e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
32e70 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
32e80 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
32e90 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
32ea0 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
32eb0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
32ec0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
32ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32ee0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32ef0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32f00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32f20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
32f30 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
32f40 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
32f50 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
32f60 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
32f70 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
32f80 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
32f90 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
32fa0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
32fb0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
32fc0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
32fd0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
32fe0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32ff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
33000 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
33010 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
33020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33030 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
33040 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
33050 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
33060 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
33070 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
33080 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
33090 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
330a0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
330b0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
330c0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
330d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
330e0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
330f0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
33100 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
33110 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
33120 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
33130 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
33140 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
33150 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
33160 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
33170 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
33180 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
33190 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
331a0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
331b0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
331c0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
331d0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
331e0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
331f0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
33200 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
33210 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
33220 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
33230 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
33240 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
33250 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
33260 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
33270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33280 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
33290 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
332a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
332b0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
332c0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
332d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
332e0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
332f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
33300 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
33310 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
33320 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
33330 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
33340 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
33350 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
33360 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
33370 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
33380 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
33390 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
333a0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
333b0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
333c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
333d0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
333e0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
333f0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
33400 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
33410 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
33420 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
33430 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
33440 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
33450 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
33460 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
33470 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
33480 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
33490 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
334a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
334b0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
334c0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
334d0 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
334e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
334f0 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
33500 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
33510 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
33520 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
33530 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
33540 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
33550 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
33560 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
33570 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
33580 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
33590 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
335a0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
335b0 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
335c0 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
335d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
335e0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
335f0 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  out the cell */.
33600 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33610 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
33620 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
33630 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
33640 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
33650 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
33660 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33670 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
33680 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
33690 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
336a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
336b0 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28  l, pInfo);.  if(
336c0 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d   pInfo->nLocal==
336d0 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
336e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
336f0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
33700 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
33710 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
33720 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
33730 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
33740 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20  +pInfo->nSize-1 
33750 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
33760 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
33770 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33780 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33790 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e  ;  /* Cell exten
337a0 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
337b0 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  age */.  }.  ovf
337c0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
337d0 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e  (pCell + pInfo->
337e0 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73  nSize - 4);.  as
337f0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
33800 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
33810 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
33820 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
33830 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49  4;.  nOvfl = (pI
33840 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
33850 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
33860 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
33870 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
33880 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
33890 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
338a0 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d  PT_DB && (pInfo-
338b0 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  >nPayload + ovfl
338c0 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
338d0 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
338e0 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
338f0 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
33900 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
33910 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
33920 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
33930 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
33940 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
33950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
33960 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
33970 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
33980 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
33990 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
339a0 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
339b0 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
339c0 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
339d0 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
339e0 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
339f0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
33a00 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
33a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
33a20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
33a30 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
33a40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
33a50 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
33a60 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
33a70 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
33a80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33a90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
33aa0 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
33ab0 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
33ac0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
33ad0 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
33ae0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
33af0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
33b00 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
33b10 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
33b20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
33b30 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
33b40 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
33b50 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
33b60 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
33b70 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
33b80 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
33b90 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
33ba0 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
33bb0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
33bc0 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
33bd0 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
33be0 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
33bf0 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
33c00 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
33c10 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
33c20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
33c30 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
33c40 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
33c50 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
33c60 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
33c70 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
33c80 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
33c90 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
33ca0 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
33cb0 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
33cc0 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
33cd0 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
33ce0 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
33cf0 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
33d00 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
33d10 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
33d20 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
33d30 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
33d40 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
33d50 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
33d60 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
33d70 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
33d80 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
33d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
33da0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33db0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
33dc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
33dd0 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
33de0 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
33df0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
33e00 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
33e10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
33e20 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
33e30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
33e40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33e50 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
33e60 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
33e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33e80 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
33e90 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
33ea0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
33eb0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
33ec0 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
33ed0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
33ee0 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
33ef0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
33f00 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
33f10 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
33f20 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
33f30 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
33f40 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
33f50 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
33f60 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
33f70 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
33f80 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
33f90 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
33fa0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
33fb0 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
33fc0 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
33fd0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
33fe0 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
33ff0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
34000 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
34010 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
34020 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
34030 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
34040 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
34050 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
34060 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
34070 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
34080 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
34090 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
340a0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
340b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
340c0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
340d0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
340e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
340f0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
34100 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
34110 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
34120 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79    const BtreePay
34130 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20  load *pX,       
34140 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68   /* Payload with
34150 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
34160 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  uct the cell */.
34170 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
34180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34190 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
341a0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
341b0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
341c0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
341d0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
341e0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
341f0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
34200 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
34210 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
34220 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
34230 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
34240 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
34250 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
34260 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
34270 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
34280 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
34290 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
342a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
342b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
342c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
342d0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
342e0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
342f0 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
34300 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
34310 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
34320 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
34330 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
34340 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
34350 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
34360 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
34370 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
34380 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34390 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
343a0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
343b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
343c0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
343d0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
343e0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
343f0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
34400 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
34410 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ize;.  if( pPage
34420 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
34430 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e  nPayload = pX->n
34440 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f  Data + pX->nZero
34450 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
34460 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63  >pData;.    nSrc
34470 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20   = pX->nData;.  
34480 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34490 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f  >intKeyLeaf ); /
344a0 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  * fillInCell() o
344b0 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c  nly called for l
344c0 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65  eaves */.    nHe
344d0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
344e0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
344f0 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
34500 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
34510 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
34520 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
34530 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  )&pX->nKey);.  }
34540 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
34550 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66  ( pX->nKey<=0x7f
34560 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b  ffffff && pX->pK
34570 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72  ey!=0 );.    nSr
34580 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28  c = nPayload = (
34590 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20  int)pX->nKey;.  
345a0 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65    pSrc = pX->pKe
345b0 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  y;.    nHeader +
345c0 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
345d0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
345e0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  Payload);.  }.  
345f0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
34600 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  e payload */.  i
34610 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
34620 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
34630 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
34640 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
34650 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
34660 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
34670 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
34680 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
34690 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
346a0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50    spaceLeft = nP
346b0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69  ayload;.    pPri
346c0 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65  or = pCell;.  }e
346d0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20  lse{.    int mn 
346e0 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
346f0 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20  l;.    n = mn + 
34700 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
34710 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
34720 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
34730 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
34740 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
34750 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
34760 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
34770 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
34780 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
34790 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
347a0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
347b0 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  n;.    *pnSize =
347c0 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
347d0 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26  ;.    pPrior = &
347e0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
347f0 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64  ;.  }.  pPayload
34800 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
34810 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  r];..  /* At thi
34820 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
34830 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
34840 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
34850 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
34860 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
34870 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
34880 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
34890 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
348a0 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
348b0 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
348c0 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
348d0 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
348e0 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
348f0 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
34900 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
34910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34920 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
34930 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
34940 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
34950 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
34960 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
34970 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
34980 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
34990 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
349a0 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
349b0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
349c0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
349d0 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
349e0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
349f0 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
34a00 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
34a10 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
34a20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
34a30 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
34a40 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
34a50 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
34a60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
34a70 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43  _DEBUG.  {.    C
34a80 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
34a90 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
34aa0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
34ab0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
34ac0 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28  sert( nHeader==(
34ad0 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f  int)(info.pPaylo
34ae0 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20  ad - pCell) );. 
34af0 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e     assert( info.
34b00 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29  nKey==pX->nKey )
34b10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
34b20 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53  nSize == info.nS
34b30 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
34b40 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20  t( spaceLeft == 
34b50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20  info.nLocal );. 
34b60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
34b70 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61  Write the payloa
34b80 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  d into the local
34b90 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78   Cell and any ex
34ba0 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  tra into overflo
34bb0 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69  w pages */.  whi
34bc0 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
34bd0 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
34be0 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
34bf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34c00 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
34c10 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
34c20 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
34c30 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
34c40 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
34c50 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
34c60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34c70 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
34c80 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
34c90 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
34ca0 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
34cb0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
34cc0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
34cd0 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
34ce0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
34cf0 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
34d00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
34d10 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
34d20 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
34d30 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
34d40 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
34d50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34d60 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34d70 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
34d80 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
34d90 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
34da0 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
34db0 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
34dc0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
34dd0 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
34de0 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
34df0 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
34e00 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
34e10 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
34e20 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
34e30 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
34e40 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
34e50 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
34e60 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
34e70 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
34e80 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
34e90 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
34ea0 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
34eb0 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
34ec0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
34ed0 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
34ee0 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
34ef0 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
34f00 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
34f10 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
34f20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  the uninitialize
34f30 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
34f40 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
34f50 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
34f60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
34f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
34f80 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34f90 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
34fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
34fb0 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
34fc0 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
34fd0 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
34fe0 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
34ff0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
35000 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
35010 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
35020 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
35030 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
35040 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
35050 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
35060 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35070 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
35080 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35090 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
350a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
350b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
350c0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
350d0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
350e0 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
350f0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
35100 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
35110 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
35120 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
35130 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
35140 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
35150 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
35160 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
35170 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35180 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
35190 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
351a0 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
351b0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
351c0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
351d0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
351e0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
351f0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
35200 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
35210 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
35220 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
35230 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
35240 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
35250 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
35260 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35270 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
35280 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
35290 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
352a0 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
352b0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
352c0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
352d0 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
352e0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
352f0 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
35300 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
35310 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
35320 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
35330 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
35340 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
35350 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
35360 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
35370 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
35380 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
35390 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
353a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
353b0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
353c0 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
353d0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
353e0 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
353f0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
35400 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
35410 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
35420 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
35430 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
35440 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
35450 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35460 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
35470 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
35480 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
35490 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
354a0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
354b0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
354c0 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
354d0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
354e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
354f0 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
35500 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
35510 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
35520 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
35530 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
35540 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35550 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
35560 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
35570 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
35580 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
35590 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
355a0 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
355b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
355c0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
355d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
355e0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
355f0 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
35600 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
35610 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
35620 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
35630 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
35640 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
35650 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  t -= n;.  }.  re
35660 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
35670 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
35680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
35690 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
356a0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
356b0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
356c0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
356d0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
356e0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
356f0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
35700 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
35710 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
35720 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35730 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
35740 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
35750 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
35760 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
35770 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
35780 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
35790 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
357a0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
357b0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
357c0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
357d0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
357e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
357f0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
35800 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33   int *pRC){.  u3
35810 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  2 pc;         /*
35820 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
35830 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
35840 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
35850 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
35860 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
35870 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
35880 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
35890 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
358a0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
358b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
358c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
358d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
358e0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
358f0 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
35900 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
35910 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
35920 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
35930 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
35940 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
35950 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
35960 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
35970 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
35980 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
35990 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
359a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
359b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
359c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
359d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
359e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
359f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35a00 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
35a10 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
35a20 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
35a30 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
35a40 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
35a50 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
35a60 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
35a70 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
35a80 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
35a90 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
35aa0 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
35ab0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35ac0 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
35ad0 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
35ae0 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
35af0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
35b00 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
35b10 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
35b20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35b30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
35b40 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
35b50 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
35b60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35b70 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
35b80 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
35b90 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
35ba0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
35bb0 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
35bc0 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
35bd0 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
35be0 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
35bf0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
35c00 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
35c10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
35c20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
35c30 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
35c40 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
35c50 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c70 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
35c80 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
35c90 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
35ca0 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
35cb0 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
35cc0 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
35cd0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
35ce0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
35cf0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
35d00 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
35d10 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
35d20 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
35d30 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
35d40 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
35d50 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
35d60 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
35d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
35d80 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
35d90 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
35da0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
35db0 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
35dc0 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
35dd0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
35de0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
35df0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
35e00 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
35e10 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
35e20 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
35e30 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
35e40 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
35e50 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
35e60 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
35e70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
35e80 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
35e90 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
35ea0 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
35eb0 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
35ec0 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
35ed0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
35ee0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
35ef0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
35f00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35f10 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
35f20 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74  .**.** *pRC must
35f30 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68   be SQLITE_OK wh
35f40 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
35f50 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
35f60 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
35f70 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35f80 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
35f90 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
35fa0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
35fb0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
35fc0 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
35fd0 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
35fe0 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
35ff0 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
36000 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
36010 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
36020 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
36030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
36040 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
36050 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
36060 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
36070 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
36080 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
36090 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
360a0 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
360b0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
360c0 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
360d0 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
360e0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
360f0 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
36100 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
36110 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
36120 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
36130 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
36140 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
36150 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
36160 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
36170 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
36180 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
36190 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
361a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
361b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
361c0 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
361d0 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20  u8 *pIns;       
361e0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
361f0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  n pPage->aCellId
36200 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c  x[] where no cel
36210 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20  l inserted */.. 
36220 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53   assert( *pRC==S
36230 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
36240 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
36250 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
36260 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
36270 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43  ;.  assert( MX_C
36280 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
36290 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
362a0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
362b0 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
362c0 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54  >pBt) || CORRUPT
362d0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
362e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
362f0 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
36300 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
36310 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
36320 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
36330 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
36340 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
36350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36360 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
36370 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
36380 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
36390 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
363a0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
363b0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
363c0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
363d0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
363e0 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
363f0 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
36400 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
36410 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
36420 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
36430 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
36440 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
36450 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
36460 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
36470 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
36480 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
36490 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
364a0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
364b0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
364c0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
364d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
364e0 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
364f0 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78  rt( sz==pPage->x
36500 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
36510 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38  pCell) || (sz==8
36520 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b   && iChild>0) );
36530 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
36540 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
36550 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
36560 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
36570 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
36580 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  emp, pCell, sz);
36590 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
365a0 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
365b0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
365c0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
365d0 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
365e0 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
365f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
36600 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
36610 20 61 67 61 69 6e 73 74 20 41 72 72 61 79 53 69   against ArraySi
36620 7a 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68 6f  ze-1 since we ho
36630 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74 72  ld back one extr
36640 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73  a slot.    ** as
36650 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20   a contingency. 
36660 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
36670 20 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72 65   never need more
36680 20 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77   than 3 overflow
36690 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75  .    ** slots bu
366a0 74 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  t 4 are allocate
366b0 64 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  d, just to be sa
366c0 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  fe. */.    asser
366d0 74 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a 65  t( j < ArraySize
366e0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d  (pPage->apOvfl)-
366f0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  1 );.    pPage->
36700 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
36710 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
36720 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
36730 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ;..    /* When m
36740 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
36750 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72  s occur, they ar
36760 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74  e always sequent
36770 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a  ial and in.    *
36780 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  * sorted order. 
36790 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73   This invariants
367a0 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d   arise because m
367b0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
367c0 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c  s can.    ** onl
367d0 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73  y occur when ins
367e0 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63  erting divider c
367f0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
36800 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67  rent page during
36810 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  .    ** balancin
36820 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  g, and the divid
36830 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74  ers are adjacent
36840 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20   and sorted..   
36850 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36860 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61  j==0 || pPage->a
36870 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29  iOvfl[j-1]<(u16)
36880 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  i ); /* Overflow
36890 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
368a0 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
368b0 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67   j==0 || i==pPag
368c0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31  e->aiOvfl[j-1]+1
368d0 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f   );   /* Overflo
368e0 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61  ws are sequentia
368f0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l */.  }else{.  
36900 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
36910 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
36920 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
36950 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
36960 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
36970 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36980 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36990 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
369a0 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
369b0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
369c0 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50  assert( &data[pP
369d0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d  age->cellOffset]
369e0 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  ==pPage->aCellId
369f0 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  x );.    rc = al
36a00 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
36a10 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
36a20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
36a30 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
36a40 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
36a50 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
36a60 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
36a70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
36a80 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
36a90 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
36aa0 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20  cessfully */.   
36ab0 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
36ac0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
36ad0 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63   idx >= pPage->c
36ae0 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
36af0 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f  e->nCell+2 || CO
36b00 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
36b10 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
36b20 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
36b30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
36b40 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
36b50 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
36b60 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
36b70 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c  data[idx], pCell
36b80 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69  , sz);.    if( i
36b90 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
36ba0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
36bb0 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
36bc0 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50   }.    pIns = pP
36bd0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20  age->aCellIdx + 
36be0 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  i*2;.    memmove
36bf0 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32  (pIns+2, pIns, 2
36c00 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
36c10 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79   i));.    put2by
36c20 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20  te(pIns, idx);. 
36c30 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
36c40 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d  +;.    /* increm
36c50 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ent the cell cou
36c60 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b  nt */.    if( (+
36c70 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  +data[pPage->hdr
36c80 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20  Offset+4])==0 ) 
36c90 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
36ca0 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20  ffset+3]++;.    
36cb0 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
36cc0 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
36cd0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61  rOffset+3])==pPa
36ce0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66  ge->nCell );.#if
36cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36d00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
36d10 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
36d20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
36d30 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
36d40 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
36d50 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
36d60 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
36d70 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
36d80 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
36d90 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
36da0 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
36db0 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
36dc0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
36dd0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
36de0 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
36df0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
36e00 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79  *.** A CellArray
36e10 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
36e20 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e   a cache of poin
36e30 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66  ters and sizes f
36e40 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74  or a.** consecut
36e50 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ive sequence of 
36e60 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74  cells that might
36e70 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74   be held on mult
36e80 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74  iple pages..*/.t
36e90 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65  ypedef struct Ce
36ea0 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61  llArray CellArra
36eb0 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72  y;.struct CellAr
36ec0 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c  ray {.  int nCel
36ed0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
36ee0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
36ef0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
36f00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65  /.  MemPage *pRe
36f10 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  f;          /* R
36f20 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f  eference page */
36f30 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
36f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
36f50 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
36f60 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
36f70 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
36f80 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
36f90 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
36fa0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b  n apCell[] */.};
36fb0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
36fc0 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73  e the cell sizes
36fd0 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20   at idx, idx+1, 
36fe0 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76  ..., idx+N-1 hav
36ff0 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74  e been.** comput
37000 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
37010 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43  id populateCellC
37020 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  ache(CellArray *
37030 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  p, int idx, int 
37040 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  N){.  assert( id
37050 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70  x>=0 && idx+N<=p
37060 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69  ->nCell );.  whi
37070 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61  le( N>0 ){.    a
37080 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c  ssert( p->apCell
37090 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20  [idx]!=0 );.    
370a0 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64  if( p->szCell[id
370b0 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  x]==0 ){.      p
370c0 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20  ->szCell[idx] = 
370d0 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
370e0 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
370f0 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20  pCell[idx]);.   
37100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
37110 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
37120 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
37130 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d    p->szCell[idx]
37140 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  ==p->pRef->xCell
37150 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
37160 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b  >apCell[idx]) );
37170 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b  .    }.    idx++
37180 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d  ;.    N--;.  }.}
37190 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
371a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e  he size of the N
371b0 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  th element of th
371c0 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a  e cell array.*/.
371d0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
371e0 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75  INLINE u16 compu
371f0 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41  teCellSize(CellA
37200 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  rray *p, int N){
37210 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20  .  assert( N>=0 
37220 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b  && N<p->nCell );
37230 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a  .  assert( p->sz
37240 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20  Cell[N]==0 );.  
37250 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70  p->szCell[N] = p
37260 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
37270 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
37280 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75  Cell[N]);.  retu
37290 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
372a0 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 61  .}.static u16 ca
372b0 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c  chedCellSize(Cel
372c0 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e  lArray *p, int N
372d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  ){.  assert( N>=
372e0 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20  0 && N<p->nCell 
372f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  );.  if( p->szCe
37300 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70  ll[N] ) return p
37310 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72  ->szCell[N];.  r
37320 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c  eturn computeCel
37330 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a  lSize(p, N);.}..
37340 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
37350 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
37360 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20  inters to nCell 
37370 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c  b-tree page cell
37380 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c  s. The .** szCel
37390 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  l[] array contai
373a0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
373b0 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c  ytes of each cel
373c0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
373d0 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65  .** replaces the
373e0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
373f0 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69  s of page pPg wi
37400 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
37410 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61  of the cell.** a
37420 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rray..**.** Some
37430 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
37440 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75   apCell[] may cu
37450 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
37460 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a  d in pPg. This.*
37470 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  * function works
37480 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
37490 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20   caused by this 
374a0 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  by making a copy
374b0 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68   of any .** such
374c0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76   cells before ov
374d0 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61  erwriting the pa
374e0 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  ge data..**.** T
374f0 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65  he MemPage.nFree
37500 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
37510 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  dated by this fu
37520 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68  nction. It is th
37530 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
37540 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
37550 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72  er to set it cor
37560 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
37570 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67  c int rebuildPag
37580 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
37590 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
375a0 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69       /* Edit thi
375b0 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
375c0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
375d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
375e0 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  inal number of c
375f0 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ells on page */.
37600 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
37610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37620 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37630 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
37640 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
37650 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37660 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
37670 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
37680 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
37690 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
376a0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
376b0 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ader on pPg */. 
376c0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
376d0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20  a = pPg->aData; 
376e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
376f0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
37700 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   pPg */.  const 
37710 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
37720 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
37730 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f  eSize;.  u8 * co
37740 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
37750 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
37760 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43   int i;.  u8 *pC
37770 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
37780 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54  ellIdx;.  u8 *pT
37790 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
377a0 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e  rTempSpace(pPg->
377b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
377c0 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20  u8 *pData;..  i 
377d0 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
377e0 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
377f0 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61  cpy(&pTmp[i], &a
37800 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53  Data[i], usableS
37810 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61  ize - i);..  pDa
37820 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72  ta = pEnd;.  for
37830 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
37840 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
37850 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a  ll = apCell[i];.
37860 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57      if( SQLITE_W
37870 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74  ITHIN(pCell,aDat
37880 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20  a,pEnd) ){.     
37890 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
378a0 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
378b0 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d     }.    pData -
378c0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
378d0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
378e0 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61  tr, (pData - aDa
378f0 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
37900 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28  tr += 2;.    if(
37910 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74   pData < pCellpt
37920 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
37930 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
37940 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
37950 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b  , pCell, szCell[
37960 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
37970 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d   szCell[i]==pPg-
37980 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20  >xCellSize(pPg, 
37990 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
379a0 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74  T_DB );.    test
379b0 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21  case( szCell[i]!
379c0 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
379d0 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20  pPg,pCell) );.  
379e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
379f0 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
37a00 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
37a10 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
37a20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
37a30 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
37a40 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
37a50 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
37a60 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
37a70 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
37a80 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
37a90 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
37aa0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
37ab0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
37ac0 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
37ad0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
37ae0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
37af0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
37b00 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
37b10 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
37b20 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
37b30 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
37b40 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  Cell.** contains
37b50 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37b60 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
37b70 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
37b80 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
37b90 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c  .** add the cell
37ba0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
37bb0 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50  array to page pP
37bc0 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20  g. If it cannot 
37bd0 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  (because .** the
37be0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
37bf0 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62  e defragmented b
37c00 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20  efore the cells 
37c10 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a  will fit), non-z
37c20 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
37c30 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
37c40 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  f the cells are 
37c50 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
37c60 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72  ly, zero is.** r
37c70 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
37c80 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72  rgument pCellptr
37c90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
37ca0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
37cb0 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
37cc0 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66  rray.** (part of
37cd0 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f   page pPg) to po
37ce0 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65  pulate. After ce
37cf0 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20  ll apCell[0] is 
37d00 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
37d10 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31  * page body, a 1
37d20 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20  6-bit offset is 
37d30 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c  written to pCell
37d40 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20  ptr. And so on, 
37d50 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c  for each.** cell
37d60 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49   in the array. I
37d70 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
37d80 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
37d90 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a  aller to ensure.
37da0 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61  ** that it is sa
37db0 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  fe to overwrite 
37dc0 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
37dd0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
37de0 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ray..**.** When 
37df0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
37e00 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61   called, *ppData
37e10 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
37e20 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tart of the .** 
37e30 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20  content area on 
37e40 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65  page pPg. If the
37e50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e   size of the con
37e60 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74  tent area is ext
37e70 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74  ended,.** *ppDat
37e80 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  a is updated to 
37e90 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
37ea0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f   start of the co
37eb0 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65  ntent area.** be
37ec0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
37ed0 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61  **.** Finally, a
37ee0 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70  rgument pBegin p
37ef0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74  oints to the byt
37f00 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
37f10 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
37f20 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20  nd of the space 
37f30 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
37f40 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65   page for the ce
37f50 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
37f60 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c  (for.** all cell
37f70 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f  s - not just tho
37f80 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  se inserted by t
37f90 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29  he current call)
37fa0 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
37fb0 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65  .** area must be
37fc0 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66   extended to bef
37fd0 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ore this point i
37fe0 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d  n order to accom
37ff0 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c  odate all.** cel
38000 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20  ls in apCell[], 
38010 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64  then the cells d
38020 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f  o not fit and no
38030 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
38040 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
38050 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  t pageInsertArra
38060 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
38070 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
38080 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
38090 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a  add cells to */.
380a0 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20    u8 *pBegin,   
380b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380c0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c    /* End of cell
380d0 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a  -pointer array *
380e0 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c  /.  u8 **ppData,
380f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38100 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
38110 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65  age content -are
38120 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  a pointer */.  u
38130 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20  8 *pCellptr,    
38140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38150 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c  * Pointer to cel
38160 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a  l-pointer area *
38170 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
38180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38190 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
381a0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61 64  first cell to ad
381b0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
381c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
381d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
381e0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
381f0 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c   to pPg */.  Cel
38200 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20  lArray *pCArray 
38210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38220 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
38230 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
38240 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67 2d  u8 *aData = pPg-
38250 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 44  >aData;.  u8 *pD
38260 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20  ata = *ppData;. 
38270 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72   int iEnd = iFir
38280 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73  st + nCell;.  as
38290 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
382a0 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66 73   || pPg->hdrOffs
382b0 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  et==0 );    /* N
382c0 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ever called on p
382d0 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69  age 1 */.  for(i
382e0 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b  =iFirst; i<iEnd;
382f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73   i++){.    int s
38300 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a 70  z, rc;.    u8 *p
38310 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63  Slot;.    sz = c
38320 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70 43  achedCellSize(pC
38330 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20 69  Array, i);.    i
38340 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20  f( (aData[1]==0 
38350 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20  && aData[2]==0) 
38360 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67 65  || (pSlot = page
38370 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c  FindSlot(pPg,sz,
38380 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  &rc))==0 ){.    
38390 20 20 69 66 28 20 28 70 44 61 74 61 20 2d 20 70    if( (pData - p
383a0 42 65 67 69 6e 29 3c 73 7a 20 29 20 72 65 74 75  Begin)<sz ) retu
383b0 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 44 61 74  rn 1;.      pDat
383c0 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  a -= sz;.      p
383d0 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20  Slot = pData;.  
383e0 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74    }.    /* pSlot
383f0 20 61 6e 64 20 70 43 41 72 72 61 79 2d 3e 61 70   and pCArray->ap
38400 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76  Cell[i] will nev
38410 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20  er overlap on a 
38420 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20  well-formed.    
38430 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  ** database.  Bu
38440 74 20 74 68 65 79 20 6d 69 67 68 74 20 66 6f 72  t they might for
38450 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
38460 61 73 65 2e 20 20 48 65 6e 63 65 20 75 73 65 20  ase.  Hence use 
38470 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a  memmove().    **
38480 20 73 69 6e 63 65 20 6d 65 6d 63 70 79 28 29 20   since me