/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ea10ca63430533c358da32e5d2b8b22aa3c6a9e84f295139e4e5bb00f635726d:


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 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a70: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3aa0: 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
3ab0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3ac0: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3ad0: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3ae0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
3af0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
3b00: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
3b10: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
3b20: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
3b30: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3b40: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3b50: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3b60: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3b70: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3b80: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3b90: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3ba0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3bb0: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3bc0: 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
3bd0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  t the cursor and
3be0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 61 67   the BtShared ag
3bf0: 72 65 65 20 61 62 6f 75 74 20 77 68 61 74 20 69  ree about what i
3c00: 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  s the current.**
3c10: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74   database connet
3c20: 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ion. This is imp
3c30: 6f 72 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64  ortant in shared
3c40: 2d 63 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20  -cache mode. If 
3c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
3c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
3c70: 74 65 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d  ters get out-of-
3c80: 73 79 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73  sync, it is poss
3c90: 69 62 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65  ible for routine
3ca0: 73 20 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49  s like.** btreeI
3cb0: 6e 69 74 50 61 67 65 28 29 20 74 6f 20 72 65 66  nitPage() to ref
3cc0: 65 72 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20  erence an stale 
3cd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3ce0: 65 72 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  er that referenc
3cf0: 65 73 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63  es a.** a connec
3d00: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c  tion that has al
3d10: 72 65 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54  ready closed.  T
3d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3d30: 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 72  sed inside asser
3d40: 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
3d50: 73 20 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74  s only and for t
3d60: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f  he purpose of do
3d70: 75 62 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68  uble-checking th
3d80: 61 74 20 74 68 65 20 62 74 72 65 65 20 63 6f 64  at the btree cod
3d90: 65 0a 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74  e.** does keep t
3da0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3db0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  ection pointers 
3dc0: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73  up-to-date..*/.s
3dd0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3de0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43  OwnsBtShared(BtC
3df0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
3e00: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3e10: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
3e20: 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d  turn (p->pBtree-
3e30: 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29  >db==p->pBt->db)
3e40: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3e50: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3e60: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
3e70: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
3e80: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3e90: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
3ea0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3eb0: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3ec0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
3ed0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3ee0: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
3ef0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
3f00: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
3f10: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3f20: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3f30: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3f40: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
3f50: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
3f60: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3f70: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
3f80: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3f90: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3fa0: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
3fb0: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
3fc0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
3fd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3fe0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3ff0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4000: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4010: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
4020: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
4030: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
4040: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4050: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
4060: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4070: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
4080: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
4090: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
40a0: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
40b0: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
40c0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
40d0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
40e0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
40f0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
4100: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
4110: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
4120: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
4130: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
4140: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
4150: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
4160: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
4170: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4180: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
4190: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
41a0: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
41b0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
41c0: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
41d0: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
41e0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
41f0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4200: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
4210: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
4220: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
4230: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
4240: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
4250: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4260: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
4270: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
4280: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
4290: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
42a0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
42b0: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
42c0: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
42d0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
42e0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
42f0: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
4300: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
4310: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
4320: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69  he table that mi
4330: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
4340: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4360: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
4370: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
4380: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
4390: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
43a0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
43b0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
43c0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
43d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
43e0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
43f0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
4400: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
4410: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
4420: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4430: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
4440: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
4450: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
4460: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
4470: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
4480: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
4490: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
44a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
44b0: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
44c0: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
44d0: 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
44e0: 70 67 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43  pgnoRoot && (isC
44f0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
4500: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
4510: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
4520: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
4530: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
4540: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
4550: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
4560: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
4570: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4580: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4590: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
45a0: 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23  rsors(w,x,y,z).#
45b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
45c0: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
45d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
45e0: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
45f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4600: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
4610: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
4620: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
4630: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
4640: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
4650: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4660: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4670: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4680: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4690: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
46a0: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
46b0: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
46c0: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
46d0: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
46e0: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
46f0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
4700: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4710: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
4720: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
4730: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
4740: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
4750: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4760: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4770: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4780: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4790: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
47a0: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
47b0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
47c0: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
47d0: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
47e0: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
47f0: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
4800: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
4810: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
4820: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
4830: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
4840: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
4850: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4860: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4870: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4880: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4890: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
48a0: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
48b0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
48c0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
48d0: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
48e0: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
48f0: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
4900: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
4910: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
4920: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
4930: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
4940: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
4950: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4960: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4970: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4980: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4990: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
49a0: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
49b0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
49c0: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
49d0: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
49e0: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
49f0: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
4a00: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
4a10: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
4a20: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
4a30: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
4a40: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4a50: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4a60: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4a70: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4a80: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4a90: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4aa0: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4ab0: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4ac0: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4ad0: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4ae0: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4af0: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
4b00: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
4b10: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
4b20: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
4b30: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
4b40: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
4b50: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4b60: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4b70: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4b80: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4b90: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4ba0: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4bb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4bc0: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4bd0: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4be0: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4bf0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4c00: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
4c10: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
4c20: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
4c30: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
4c40: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
4c50: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4c60: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4c70: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4c80: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4c90: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4ca0: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4cb0: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4cc0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4cd0: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4ce0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4cf0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
4d00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4d10: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
4d20: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4d30: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
4d40: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
4d50: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4d60: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4d70: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4d80: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4d90: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4da0: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4db0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4dc0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
4dd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4de0: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
4df0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
4e00: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
4e10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4e20: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
4e30: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
4e40: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
4e50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
4e60: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
4e70: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
4e80: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
4e90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4ea0: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
4eb0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4ec0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
4ed0: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
4ee0: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
4ef0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
4f00: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
4f10: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
4f20: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
4f30: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
4f40: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
4f50: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
4f60: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4f70: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
4f80: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4f90: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4fa0: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
4fb0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4fc0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
4fd0: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
4fe0: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
4ff0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5000: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
5010: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
5020: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
5030: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
5040: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
5050: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
5060: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
5070: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
5080: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
5090: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
50a0: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
50b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
50c0: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
50d0: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
50e0: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
50f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
5100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
5110: 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  ease all of the 
5120: 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66  apPage[] pages f
5130: 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
5140: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
5150: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5160: 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20  rPages(BtCursor 
5170: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
5180: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
5190: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ge>=0 ){.    for
51a0: 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50  (i=0; i<pCur->iP
51b0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
51c0: 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
51d0: 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
51e0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
51f0: 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
5200: 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ll(pCur->pPage);
5210: 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
5220: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = -1;.  }.}../*
5230: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70  .** The cursor p
5240: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
5250: 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  y argument must 
5260: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
5270: 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74   entry.** when t
5280: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5290: 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76  called (i.e. hav
52a0: 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  e eState==CURSOR
52b0: 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a  _VALID). This.**
52c0: 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20   function saves 
52d0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
52e0: 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62  or key in variab
52f0: 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61  les pCur->nKey a
5300: 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79  nd.** pCur->pKey
5310: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
5320: 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
5330: 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69  ssful or an SQLi
5340: 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64  te error .** cod
5350: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
5360: 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
5370: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69   is open on an i
5380: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
5390: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  n the integer ke
53a0: 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29  y.** (the rowid)
53b0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43   is stored in pC
53c0: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75  ur->nKey and pCu
53d0: 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20  r->pKey is left 
53e0: 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20  set to.** NULL. 
53f0: 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
5400: 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69   open on a non-i
5410: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
5420: 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20  n pCur->pKey is 
5430: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5440: 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   to a malloced b
5450: 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79  uffer pCur->nKey
5460: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63   bytes in size c
5470: 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
5480: 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  e key..*/.static
5490: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b   int saveCursorK
54a0: 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
54b0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
54c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
54d0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
54e0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
54f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5500: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5510: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5520: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5530: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75  ..  if( pCur->cu
5540: 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  rIntKey ){.    /
5550: 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64  * Only the rowid
5560: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
5570: 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a   a table btree *
5580: 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  /.    pCur->nKey
5590: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
55a0: 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b  ntegerKey(pCur);
55b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
55c0: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74   For an index bt
55d0: 72 65 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f  ree, save the co
55e0: 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65  mplete key conte
55f0: 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  nt */.    void *
5600: 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e  pKey;.    pCur->
5610: 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  nKey = sqlite3Bt
5620: 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
5630: 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d  Cur);.    pKey =
5640: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5650: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5660: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5670: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5680: 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75  BtreePayload(pCu
5690: 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d  r, 0, (int)pCur-
56a0: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
56b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
56c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
56d0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
56e0: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
56f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5700: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
5710: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5720: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5730: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
5740: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5750: 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  ( !pCur->curIntK
5760: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
5770: 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  y );.  return rc
5780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
5790: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
57a0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
57b0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
57c0: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
57d0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
57e0: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
57f0: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
5800: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5810: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  K..**.** The cal
5820: 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
5830: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
5840: 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53  is valid (has eS
5850: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5860: 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ID).** prior to 
5870: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
5880: 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  tine.  .*/.stati
5890: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
58a0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
58b0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
58c0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
58d0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
58e0: 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52  r->eState || CUR
58f0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43  SOR_SKIPNEXT==pC
5900: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
5910: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
5920: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
5930: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5940: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
5950: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
5960: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5970: 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  T ){.    pCur->e
5980: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
5990: 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ALID;.  }else{. 
59a0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
59b0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  t = 0;.  }..  rc
59c0: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79   = saveCursorKey
59d0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
59e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
59f0: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5a00: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5a10: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5a20: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
5a30: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
5a40: 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
5a50: 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
5a60: 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
5a70: 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74  Ovfl|BTCF_AtLast
5a80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5a90: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
5aa0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
5ab0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
5ac0: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
5ad0: 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72  sOnList(BtCursor
5ae0: 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a  *,Pgno,BtCursor*
5af0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  );../*.** Save t
5b00: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
5b10: 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63  all cursors (exc
5b20: 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61  ept pExcept) tha
5b30: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  t are open on.**
5b40: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5b50: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
5b60: 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63 75    "Saving the cu
5b70: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d  rsor position" m
5b80: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
5b90: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5ba0: 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62   btree is rememb
5bb0: 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20 77  ered in such a w
5bc0: 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  ay that it can b
5bd0: 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20  e.** moved back 
5be0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74  to the same spot
5bf0: 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65 65   after the btree
5c00: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
5c10: 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
5c20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a  tine is called j
5c30: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5c40: 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  r pExcept is use
5c50: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a  d to modify the.
5c60: 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78  ** table, for ex
5c70: 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65  ample in BtreeDe
5c80: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5c90: 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  nsert()..**.** I
5ca0: 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
5cb0: 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
5cc0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
5cd0: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
5ce0: 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f   .** cursors sho
5cf0: 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20 42  uld have their B
5d00: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
5d10: 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72 65  g set.  The btre
5d20: 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75  eCursor().** rou
5d30: 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68  tine enforces th
5d40: 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72  at rule.  This r
5d50: 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64  outine only need
5d60: 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69  s to be called i
5d70: 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f  n.** the uncommo
5d80: 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78 70  n case when pExp
5d90: 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43 46  ect has the BTCF
5da0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5db0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  et..**.** If pEx
5dc0: 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69  pect!=NULL and i
5dd0: 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f  f no other curso
5de0: 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20  rs are found on 
5df0: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61  the same root-pa
5e00: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ge,.** then the 
5e10: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5e20: 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73  ag on pExpect is
5e30: 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f   cleared, to avo
5e40: 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f  id another.** po
5e50: 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20  intless call to 
5e60: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
5e70: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5e80: 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72  on note:  This r
5e90: 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68  outine merely ch
5ea0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ecks to see if a
5eb0: 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65  ny cursors.** ne
5ec0: 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20  ed to be saved. 
5ed0: 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f   It calls out to
5ee0: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5ef0: 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75  st() in the (unu
5f00: 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74  sual).** event t
5f10: 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20  hat cursors are 
5f20: 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67  in need to being
5f30: 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   saved..*/.stati
5f40: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
5f50: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
5f60: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
5f70: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
5f80: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
5f90: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
5fa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5fb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5fc0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
5fd0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
5fe0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
5ff0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
6000: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
6010: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6020: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6030: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6040: 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b  ==iRoot) ) break
6050: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
6060: 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f  return saveCurso
6070: 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f  rsOnList(p, iRoo
6080: 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69  t, pExcept);.  i
6090: 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45 78  f( pExcept ) pEx
60a0: 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26  cept->curFlags &
60b0: 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  = ~BTCF_Multiple
60c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
60d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
60e0: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
60f0: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
6100: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
6110: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
6120: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
6130: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
6140: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
6150: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
6160: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
6170: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
6180: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
6190: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
61a0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
61b0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
61c0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
61d0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
61e0: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
61f0: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
6200: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6210: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6220: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6230: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
6240: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
6250: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
6260: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
6270: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
6280: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
6290: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
62a0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
62b0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
62c0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
62d0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
62e0: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
62f0: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
6300: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6310: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6320: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6330: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
6340: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
6350: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6360: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
6370: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
6380: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
6390: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
63a0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
63b0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
63c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
63d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
63e0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
63f0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
6400: 28 20 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  ( p->iPage>=0 );
6410: 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65  .        btreeRe
6420: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
6430: 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ges(p);.      }.
6440: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
6450: 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65  >pNext;.  }while
6460: 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ( p );.  return 
6470: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6480: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
6490: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
64a0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
64b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
64c0: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
64d0: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
64e0: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
64f0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
6500: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6510: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
6520: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
6530: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6540: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
6550: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
6560: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
6570: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
6580: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
6590: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
65a0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
65b0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
65c0: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
65d0: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
65e0: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
65f0: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
6600: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
6610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6620: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
6630: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
6640: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
6650: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
6660: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
6670: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
6680: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
6690: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
66a0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
66b0: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
66c0: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
66d0: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
66e0: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
66f0: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
6700: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
6710: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
6720: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
6730: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
6740: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
6750: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
6760: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
6770: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
6780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6790: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
67a0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
67b0: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
67c0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
67d0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
67e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
67f0: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6800: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6810: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
6820: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
6830: 6f 72 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ord(pCur->pKeyIn
6840: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  fo);.    if( pId
6850: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
6860: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
6870: 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  PT;.    sqlite3V
6880: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
6890: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
68a0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
68b0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
68c0: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
68d0: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ld==0 ){.      r
68e0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
68f0: 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
6900: 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20  oveto_done;.    
6910: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
6920: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
6930: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6940: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6950: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6960: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6970: 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a  s);.moveto_done:
6980: 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
6990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
69a0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
69b0: 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29  fo->db, pIdxKey)
69c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
69d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
69e0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
69f0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
6a00: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
6a10: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6a20: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6a30: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6a40: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6a50: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6a60: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6a70: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6a80: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6a90: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6aa0: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6ab0: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6ac0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6ad0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6ae0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
6af0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
6b00: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6b10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b20: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6b30: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6b40: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6b50: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6b60: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6b70: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
6b80: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
6b90: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6ba0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6bb0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6bc0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6bd0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
6be0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
6bf0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
6c00: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6c10: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6c20: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6c30: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6c40: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6c50: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
6c60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c70: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c80: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
6c90: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
6ca0: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
6cb0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
6cc0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6cd0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6ce0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
6cf0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
6d00: 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b  ext |= skipNext;
6d10: 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
6d20: 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d  kipNext && pCur-
6d30: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6d40: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70  VALID ){.      p
6d50: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6d60: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
6d70: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6d80: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
6d90: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6da0: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
6db0: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6dc0: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
6dd0: 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52  .         btreeR
6de0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6df0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
6e00: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
6e10: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6e20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6e30: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
6e40: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
6e50: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74  tion where.** it
6e60: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6e70: 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e  , or has been in
6e80: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e  validated for an
6e90: 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a  y other reason..
6ea0: 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  ** Cursors can m
6eb0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
6ec0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
6ed0: 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ng at is deleted
6ee0: 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64   out.** from und
6ef0: 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61  er them, for exa
6f00: 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69  mple.  Cursor mi
6f10: 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66  ght also move if
6f20: 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72   a btree.** is r
6f30: 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  ebalanced..**.**
6f40: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
6f50: 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c  utine with a NUL
6f60: 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  L cursor pointer
6f70: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a   returns false..
6f80: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65  **.** Use the se
6f90: 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74  parate sqlite3Bt
6fa0: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
6fb0: 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  () routine to re
6fc0: 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a  store a cursor.*
6fd0: 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20  * back to where 
6fe0: 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69  it ought to be i
6ff0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
7000: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a  eturns true..*/.
7010: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7020: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
7030: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7040: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
7050: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7060: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
7070: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7080: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7090: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
70a0: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
70b0: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
70c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
70d0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
70e0: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
70f0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
7100: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
7110: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
7120: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
7130: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
7140: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7150: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7160: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7170: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7180: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7190: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
71a0: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
71b0: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
71c0: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
71d0: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
71e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
71f0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
7200: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
7210: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
7220: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
7230: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
7240: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7250: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7260: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7270: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7280: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7290: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
72a0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
72b0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
72c0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
72d0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
72e0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
72f0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7300: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7310: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7320: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7330: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7340: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7350: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7360: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7370: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7380: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7390: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
73a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
73b0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
73c0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
73d0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
73e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
73f0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7400: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7410: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7420: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7430: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7440: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7450: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7460: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7470: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7480: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7490: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
74a0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
74b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
74c0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
74d0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
74e0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
74f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7500: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7510: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7520: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7530: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7540: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7550: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
7560: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
7570: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
7580: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7590: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
75a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
75b0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50  OR_HINTS./*.** P
75c0: 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20  rovide hints to 
75d0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
75e0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74   particular hint
75f0: 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20   given (and the 
7600: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62  type.** and numb
7610: 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67  er of the vararg
7620: 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73  s parameters) is
7630: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7640: 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20  he eHintType.** 
7650: 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20  parameter.  See 
7660: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  the definitions 
7670: 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e  of the BTREE_HIN
7680: 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64  T_* macros for d
7690: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
76a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
76b0: 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20  orHint(BtCursor 
76c0: 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74  *pCur, int eHint
76d0: 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a  Type, ...){.  /*
76e0: 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79   Used only by sy
76f0: 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69  stem that substi
7700: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
7710: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f  torage engine */
7720: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7730: 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69   Provide flag hi
7740: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7750: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7760: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7770: 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  tFlags(BtCursor 
7780: 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20  *pCur, unsigned 
7790: 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d  x){.  assert( x=
77a0: 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c  =BTREE_SEEK_EQ |
77b0: 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  | x==BTREE_BULKL
77c0: 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20  OAD || x==0 );. 
77d0: 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78   pCur->hints = x
77e0: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
77f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7800: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
7810: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
7820: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
7830: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
7840: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
7850: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
7860: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
7870: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7880: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
7890: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
78a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
78b0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
78c0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
78d0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
78e0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
78f0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
7900: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
7910: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7920: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
7930: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
7940: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
7950: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
7960: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
7970: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
7980: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
7990: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
79a0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
79b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
79c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
79d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
79e0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
79f0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
7a00: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7a10: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7a20: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
7a30: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7a40: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
7a50: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
7a60: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
7a70: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
7a80: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7a90: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
7aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7ab0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
7ac0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
7ad0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7af0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7b00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7b10: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7b20: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7b30: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7b40: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7b50: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7b60: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
7b70: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
7b80: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
7b90: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
7ba0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7bb0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
7bc0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7bd0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
7be0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
7bf0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
7c00: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
7c10: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
7c20: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7c30: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
7c40: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
7c50: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
7c60: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7c70: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7c80: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7c90: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
7ca0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7cb0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
7cc0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
7cd0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7ce0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
7cf0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7d00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7d10: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7d20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
7d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7d40: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
7d50: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
7d60: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
7d70: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
7d80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7d90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7da0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7db0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7dc0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7dd0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7de0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7e00: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7e10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7e20: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7e30: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7e40: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7e50: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
7e60: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7e70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
7e80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
7e90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
7ea0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
7eb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7ec0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7ed0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7ee0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7ef0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7f00: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7f10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7f20: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7f30: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7f40: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7f50: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7f60: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7f70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7f80: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7f90: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7fa0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7fb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7fc0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
7fd0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
7fe0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7ff0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
8000: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
8010: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
8020: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8030: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
8040: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
8050: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8060: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8070: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8080: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8090: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
80a0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
80b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
80c0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
80d0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
80e0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
80f0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8100: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
8110: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
8120: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
8130: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8140: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
8150: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8190: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
81a0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
81b0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
81c0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
81d0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
81e0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
81f0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8200: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8210: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8220: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
8230: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
8240: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
8250: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8260: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8270: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8280: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8290: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
82a0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
82b0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
82c0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
82d0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
82e0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
82f0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8300: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8310: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8320: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8330: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8340: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8350: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8360: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8370: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8380: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8390: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
83a0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
83b0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
83c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
83d0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
83e0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
83f0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8400: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8410: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8420: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8430: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8440: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8450: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8460: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8470: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8480: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8490: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
84a0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
84b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
84c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
84d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
84e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
84f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8500: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8510: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8520: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8530: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8540: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8550: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8560: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8570: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8580: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8590: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
85a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
85b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
85c0: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
85d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
85e0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
85f0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8600: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8610: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8620: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8630: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8640: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8650: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8660: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8670: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
8680: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
8690: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
86a0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
86b0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
86c0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
86d0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
86e0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
86f0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
8700: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
8710: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
8720: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e  ntent..**.** fin
8730: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64  dCellPastPtr() d
8740: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63  oes the same exc
8750: 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73  ept it skips pas
8760: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  t the initial.**
8770: 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
8780: 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69  inter found on i
8790: 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69  nterior pages, i
87a0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
87b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
87c0: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
87d0: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
87e0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
87f0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
8800: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
8810: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8820: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
8830: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8840: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8850: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8860: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8870: 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a  lPastPtr(P,I) \.
8880: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73    ((P)->aDataOfs
8890: 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  t + ((P)->maskPa
88a0: 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69  ge & get2byteAli
88b0: 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c  gned(&(P)->aCell
88c0: 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a  Idx[2*(I)])))...
88d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
88e0: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
88f0: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
8900: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
8910: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8920: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
8930: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
8940: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
8950: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
8960: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
8970: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
8980: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
8990: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
89a0: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
89b0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
89c0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
89d0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
89e0: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
89f0: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
8a00: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8a10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8a20: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
8a30: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
8a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8a50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
8a60: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
8a70: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
8a80: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8a90: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8aa0: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
8ab0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
8ac0: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
8ad0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
8ae0: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
8af0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
8b00: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
8b10: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
8b20: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
8b30: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
8b40: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8b50: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
8b60: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
8b70: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
8b80: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
8b90: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
8ba0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
8bb0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
8bc0: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
8bd0: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
8be0: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
8bf0: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8c00: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
8c10: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
8c20: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
8c30: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
8c40: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
8c50: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
8c60: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
8c70: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
8c80: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
8c90: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8ca0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
8cb0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8cc0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8cd0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8ce0: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
8cf0: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
8d00: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
8d10: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
8d20: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
8d30: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
8d40: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
8d50: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
8d60: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
8d70: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8d80: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8d90: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
8da0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8db0: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
8dc0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8dd0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
8de0: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
8df0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
8e00: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
8e10: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
8e20: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8e30: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
8e40: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
8e50: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
8e60: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
8e70: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
8e80: 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  )(&pInfo->pPaylo
8e90: 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  ad[pInfo->nLocal
8ea0: 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a  ] - pCell) + 4;.
8eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
8ec0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
8ed0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
8ee0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
8ef0: 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a  ge.xParseCell().
8f00: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
8f10: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
8f20: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
8f30: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
8f40: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
8f50: 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  **.** btreeParse
8f60: 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20  CellPtr()       
8f70: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8f80: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20  e leaf nodes.** 
8f90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f  btreeParseCellNo
8fa0: 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20  Payload()  =>   
8fb0: 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65  table btree inte
8fc0: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  rnal nodes.** bt
8fd0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
8fe0: 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e  ndex()   =>   in
8ff0: 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a  dex btree nodes.
9000: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
9010: 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75  lso a wrapper fu
9020: 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73  nction btreePars
9030: 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  eCell() that wor
9040: 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65  ks for.** all Me
9050: 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20  mPage types and 
9060: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
9070: 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65  the cell by inde
9080: 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a  x rather than.**
9090: 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a   by pointer..*/.
90a0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
90b0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
90c0: 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67  ayload(.  MemPag
90d0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
90e0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
90f0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9100: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9120: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
9130: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
9140: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9150: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9160: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9170: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  /.){.  assert( s
9180: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9190: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
91a0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
91b0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
91c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
91d0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
91e0: 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20  e==4 );.#ifndef 
91f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
9200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9210: 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pPage);.#endif. 
9220: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9230: 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70  4 + getVarint(&p
9240: 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26  Cell[4], (u64*)&
9250: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
9260: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9270: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c  = 0;.  pInfo->nL
9280: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66  ocal = 0;.  pInf
9290: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b  o->pPayload = 0;
92a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61  .  return;.}.sta
92b0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
92c0: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
92d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
92e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
92f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9300: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9320: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9330: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9340: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9350: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9360: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9370: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9380: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
9390: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
93a0: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
93b0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
93c0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
93d0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
93e0: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
93f0: 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20   */.  u64 iKey; 
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9410: 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76   Extracted Key v
9420: 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  alue */..  asser
9430: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9440: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9450: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9460: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
9470: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
9480: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
9490: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
94a0: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
94b0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
94c0: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
94d0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
94e0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
94f0: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9500: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9510: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9520: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
9530: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
9540: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9550: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9560: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9570: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9580: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9590: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
95a0: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
95b0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
95c0: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
95d0: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
95e0: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
95f0: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
9600: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9610: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9620: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
9630: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9640: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9650: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9660: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9670: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9680: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9690: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
96a0: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
96b0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
96c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
96d0: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
96e0: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
96f0: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
9700: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
9710: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
9720: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9730: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
9740: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
9750: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9760: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9770: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9780: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9790: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
97a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
97b0: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
97c0: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
97d0: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
97e0: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
97f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9800: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
9810: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
9820: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
9830: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9840: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
9850: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9860: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9870: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9880: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9890: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
98a0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
98b0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
98c0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
98d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
98e0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
98f0: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
9900: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
9910: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
9920: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
9930: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
9940: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
9950: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
9960: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
9970: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
9980: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
9990: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
99a0: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
99b0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
99c0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
99d0: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
99e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
99f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
9a00: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
9a10: 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ow(pPage, pCell,
9a20: 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73   pInfo);.  }.}.s
9a30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9a40: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
9a50: 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x(.  MemPage *pP
9a60: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9a70: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9a80: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9a90: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9aa0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9ab0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9ac0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9ad0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9ae0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9af0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9b00: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
9b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
9b20: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
9b30: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
9b40: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
9b50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9b60: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
9b70: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
9b80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9b90: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9ba0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9bb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9bc0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9bd0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9be0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9bf0: 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  tKeyLeaf==0 );. 
9c00: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
9c10: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9c20: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
9c30: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9c40: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
9c50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9c60: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9c70: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9c80: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9c90: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9ca0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9cb0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9cc0: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
9cd0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9ce0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9cf0: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
9d00: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
9d10: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
9d20: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9d30: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9d40: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9d50: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9d60: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9d70: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9d80: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9d90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9da0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9db0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9dc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9dd0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
9de0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
9df0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9e00: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9e10: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9e20: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9e30: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9e40: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9e50: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9e60: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9e70: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9e80: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9e90: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9ea0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9eb0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9ec0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
9ed0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
9ee0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9ef0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
9f00: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
9f10: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
9f20: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
9f30: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9f40: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9f50: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9f60: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
9f70: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9f80: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
9f90: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
9fa0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
9fb0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9fc0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9fd0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9fe0: 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  {.  pPage->xPars
9ff0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e  eCell(pPage, fin
a000: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
a010: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
a020: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a030: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
a040: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
a050: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   of the MemPage.
a060: 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74  xCellSize.** met
a070: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75  hod..**.** Compu
a080: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
a090: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
a0a0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
a0b0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
a0c0: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
a0d0: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
a0e0: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
a0f0: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
a100: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
a110: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
a120: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
a130: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
a140: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
a150: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
a160: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
a170: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
a180: 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74  load()    =>   t
a190: 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  able internal no
a1a0: 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  des.** cellSizeP
a1b0: 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20  tr()            
a1c0: 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20   =>   all index 
a1d0: 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65  nodes & table le
a1e0: 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74  af nodes.*/.stat
a1f0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
a200: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a210: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a220: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a230: 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll + pPage->chil
a240: 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72  dPtrSize; /* For
a250: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79   looping over by
a260: 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a  tes of pCell */.
a270: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a2a0: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a2b0: 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69  int */.  u32 nSi
a2c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20    /* Size value 
a2f0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69  to return */..#i
a300: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a310: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
a320: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
a330: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
a340: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
a350: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
a360: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
a370: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
a380: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
a390: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
a3a0: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
a3b0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
a3c0: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
a3d0: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
a3e0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
a3f0: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
a400: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
a410: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
a420: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
a430: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
a440: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
a450: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
a460: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
a470: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
a480: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
a490: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
a4a0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
a4b0: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
a4c0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
a4d0: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
a4e0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
a4f0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
a500: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
a510: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
a520: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
a530: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
a540: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
a550: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
a560: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
a570: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
a580: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
a590: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
a5a0: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
a5b0: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
a5c0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
a5d0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
a5e0: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
a5f0: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
a600: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
a610: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
a620: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
a630: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
a640: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
a650: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a660: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a670: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
a680: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a690: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a6a0: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
a6b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a6c0: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
a6d0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a6e0: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
a6f0: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
a700: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
a710: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
a720: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
a730: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
a740: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
a750: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
a760: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
a770: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a780: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a790: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
a7a0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a7b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
a7c0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
a7d0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
a7e0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
a7f0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
a800: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
a810: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
a820: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
a830: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
a840: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
a850: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
a860: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
a870: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
a880: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
a890: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
a8a0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
a8b0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
a8c0: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
a8d0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a8e0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a8f0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
a910: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
a920: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
a930: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a940: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a950: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a960: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a970: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a980: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a990: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a9a0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a9b0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a9c0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a9d0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a9e0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a9f0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
aa00: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
aa10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
aa20: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
aa30: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
aa40: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
aa50: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
aa60: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
aa70: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
aa80: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
aa90: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
aaa0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67  D_PARAMETER(pPag
aab0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  e);.#endif..  as
aac0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
aad0: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
aae0: 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b    pEnd = pIter +
aaf0: 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70   9;.  while( (*p
ab00: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
ab10: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
ab20: 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66  assert( debuginf
ab30: 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70  o.nSize==(u16)(p
ab40: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c  Iter - pCell) ||
ab50: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
ab60: 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49   return (u16)(pI
ab70: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a  ter - pCell);.}.
ab80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ab90: 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61  DEBUG./* This va
aba0: 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53  riation on cellS
abb0: 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64  izePtr() is used
abc0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
abd0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  t() statements.*
abe0: 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69  * only. */.stati
abf0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d  c u16 cellSize(M
ac00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ac10: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74  nt iCell){.  ret
ac20: 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  urn pPage->xCell
ac30: 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64  Size(pPage, find
ac40: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
ac50: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
ac60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ac70: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
ac90: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
aca0: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
acb0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
acc0: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
acd0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
ace0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
acf0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
ad00: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
ad10: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
ad20: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
ad30: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
ad40: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
ad50: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
ad60: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
ad70: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
ad80: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
ad90: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  =0 );.  pPage->x
ada0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
adb0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
adc0: 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
add0: 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  l<info.nPayload 
ade0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
adf0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
ae00: 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d  ll[info.nSize-4]
ae10: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
ae20: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
ae30: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
ae40: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
ae50: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
ae60: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
ae70: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
ae80: 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75   given. This rou
ae90: 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73  tine reorganizes
aea0: 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   cells within th
aeb0: 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61  e.** page so tha
aec0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
aed0: 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree-blocks on th
aee0: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73  e free-block lis
aef0: 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
af00: 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74  er nMaxFrag is t
af10: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
af20: 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  t of fragmented 
af30: 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62  space that may b
af40: 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
af50: 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74  the page after t
af60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
af70: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rns..**.** EVIDE
af80: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
af90: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
afa0: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
afb0: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
afc0: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
afd0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
afe0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
aff0: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
b000: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
b010: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
b020: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
b030: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
b040: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
b050: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
b060: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
b070: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
b080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
b090: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
b0a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
b0b0: 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69  t nMaxFrag){.  i
b0c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
b0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
b0e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
b0f0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
b100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b110: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
b120: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
b130: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
b140: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b150: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
b160: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
b170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b180: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
b190: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
b1a0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
b1b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b1c0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
b1d0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
b1e0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
b1f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b200: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
b210: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
b220: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b240: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
b250: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b260: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
b290: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
b2a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b2b0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
b2c0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
b2d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b2e0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
b2f0: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
b300: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
b310: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b320: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
b330: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
b340: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
b350: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
b360: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
b370: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
b380: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
b390: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
b3a0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
b3b0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
b3c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b3d0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b3e0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b3f0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b400: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
b410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b420: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b430: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
b440: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
b460: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
b470: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b480: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b490: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b4a0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
b4b0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
b4c0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
b4d0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b4e0: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
b4f0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
b500: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
b510: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
b520: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
b530: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b540: 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c  r+3]) );.  iCell
b550: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b560: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
b570: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
b580: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b590: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ize;..  /* This 
b5a0: 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61  block handles pa
b5b0: 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20  ges with two or 
b5c0: 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b  fewer free block
b5d0: 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20  s and nMaxFrag. 
b5e0: 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61   ** or fewer fra
b5f0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49  gmented bytes. I
b600: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
b610: 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65  s faster to move
b620: 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f   the.  ** two (o
b630: 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66  r one) blocks of
b640: 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d   cells using mem
b650: 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20 74  move() and add t
b660: 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  he required.  **
b670: 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63 68   offsets to each
b680: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
b690: 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
b6a0: 61 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f  ay than it is to
b6b0: 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75   .  ** reconstru
b6c0: 63 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ct the entire pa
b6d0: 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69  ge.  */.  if( (i
b6e0: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d  nt)data[hdr+7]<=
b6f0: 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20  nMaxFrag ){.    
b700: 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74 32  int iFree = get2
b710: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
b720: 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65  ]);.    if( iFre
b730: 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
b740: 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65  Free2 = get2byte
b750: 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a  (&data[iFree]);.
b760: 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69  .      /* pageFi
b770: 6e 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72  ndSlot() has alr
b780: 65 61 64 79 20 76 65 72 69 66 69 65 64 20 74 68  eady verified th
b790: 61 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61  at free blocks a
b7a0: 72 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20  re sorted.      
b7b0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f  ** in order of o
b7c0: 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65  ffset within the
b7d0: 20 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20   page, and that 
b7e0: 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73  no block extends
b7f0: 0a 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74  .      ** past t
b800: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
b810: 67 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65  ge. Provided the
b820: 20 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20   two free slots 
b830: 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a  do not .      **
b840: 20 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67   overlap, this g
b850: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
b860: 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c  he memmove() cal
b870: 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f  ls below will no
b880: 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77  t.      ** overw
b890: 72 69 74 65 20 74 68 65 20 75 73 61 62 6c 65 53  rite the usableS
b8a0: 69 7a 65 20 62 79 74 65 20 62 75 66 66 65 72 2c  ize byte buffer,
b8b0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61 74   even if the dat
b8c0: 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20 20  abase page.     
b8d0: 20 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20   ** is corrupt. 
b8e0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
b8f0: 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69  ( iFree2==0 || i
b900: 46 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20  Free2>iFree );. 
b910: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
b920: 65 65 2b 67 65 74 32 62 79 74 65 28 26 64 61 74  ee+get2byte(&dat
b930: 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75  a[iFree+2]) <= u
b940: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b950: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
b960: 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67  2==0 || iFree2+g
b970: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b980: 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62  ree2+2]) <= usab
b990: 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20  leSize );..     
b9a0: 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c   if( 0==iFree2 |
b9b0: 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d  | (data[iFree2]=
b9c0: 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65 65  =0 && data[iFree
b9d0: 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20  2+1]==0) ){.    
b9e0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
b9f0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
ba00: 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20  + nCell*2];.    
ba10: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20      u8 *pAddr;. 
ba20: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d         int sz2 =
ba30: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
ba40: 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  sz = get2byte(&d
ba50: 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20  ata[iFree+2]);. 
ba60: 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d         int top =
ba70: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ba80: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20  hdr+5]);.       
ba90: 20 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20   if( iFree2 ){. 
baa0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
bab0: 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29 20 72  ee+sz>iFree2 ) r
bac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bad0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
bae0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
baf0: 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65    sz2 = get2byte
bb00: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
bb10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
bb20: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a  ert( iFree+sz+sz
bb30: 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  2+iFree2-(iFree+
bb40: 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  sz) <= usableSiz
bb50: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  e );.          m
bb60: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72  emmove(&data[iFr
bb70: 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74  ee+sz+sz2], &dat
bb80: 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72  a[iFree+sz], iFr
bb90: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b  ee2-(iFree+sz));
bba0: 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d  .          sz +=
bbb0: 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz2;.        }.
bbc0: 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74          cbrk = t
bbd0: 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  op+sz;.        a
bbe0: 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72  ssert( cbrk+(iFr
bbf0: 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c  ee-top) <= usabl
bc00: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
bc10: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63   memmove(&data[c
bc20: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d  brk], &data[top]
bc30: 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20  , iFree-top);.  
bc40: 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d        for(pAddr=
bc50: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
bc60: 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70  ]; pAddr<pEnd; p
bc70: 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20  Addr+=2){.      
bc80: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bc90: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20  e(pAddr);.      
bca0: 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65 65      if( pc<iFree
bcb0: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
bcc0: 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20  dr, pc+sz); }.  
bcd0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
bce0: 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75   pc<iFree2 ){ pu
bcf0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
bd00: 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20  +sz2); }.       
bd10: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
bd20: 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a  defragment_out;.
bd30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bd40: 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  }..  cbrk = usab
bd50: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c  leSize;.  iCellL
bd60: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bd70: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
bd80: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
bd90: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
bda0: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
bdb0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
bdc0: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
bdd0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
bde0: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
bdf0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
be00: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
be10: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
be20: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
be30: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
be40: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
be50: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
be60: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
be70: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
be80: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
be90: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
bea0: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
beb0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
bec0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
bed0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
bee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bef0: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
bf00: 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pgno);.    }.   
bf10: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
bf20: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
bf30: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
bf40: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
bf50: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
bf60: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
bf70: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
bf80: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
bf90: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
bfa0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bfb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bfc0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
bfd0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
bfe0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  }.    assert( cb
bff0: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
c000: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
c010: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
c020: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
c030: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
c040: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c050: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
c060: 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62  ize );.    put2b
c070: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
c080: 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d  ;.    if( temp==
c090: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  0 ){.      int x
c0a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b  ;.      if( cbrk
c0b0: 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==pc ) continue;
c0c0: 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71  .      temp = sq
c0d0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
c0e0: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
c0f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78  pPager);.      x
c100: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c110: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
c120: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d   memcpy(&temp[x]
c130: 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72  , &data[x], (cbr
c140: 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20  k+size) - x);.  
c150: 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a      src = temp;.
c160: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
c170: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73  (&data[cbrk], &s
c180: 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  rc[pc], size);. 
c190: 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d   }.  data[hdr+7]
c1a0: 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65   = 0;.. defragme
c1b0: 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61  nt_out:.  if( da
c1c0: 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69  ta[hdr+7]+cbrk-i
c1d0: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
c1e0: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
c1f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c200: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
c210: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73  >pgno);.  }.  as
c220: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
c230: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
c240: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c250: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
c260: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
c270: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
c280: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
c290: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
c2a0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
c2b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c2c0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c2d0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c2e0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
c2f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c300: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
c310: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
c320: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
c330: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
c340: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
c350: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
c360: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
c370: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c380: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
c390: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
c3a0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
c3b0: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
c3c0: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
c3d0: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
c3e0: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
c3f0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
c400: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
c410: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
c420: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
c430: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
c440: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
c450: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
c460: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
c470: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c480: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
c490: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
c4a0: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
c4b0: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
c4c0: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
c4d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
c4e0: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
c4f0: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
c500: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c510: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
c520: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
c530: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
c540: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
c550: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
c560: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
c570: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
c580: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
c590: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
c5a0: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
c5b0: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
c5c0: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
c5d0: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
c5e0: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
c5f0: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
c600: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
c610: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
c620: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
c630: 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
c640: 28 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a  ( pc>0 );.  do{.
c650: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
c660: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c670: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
c680: 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  t */.    /* EVID
c690: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36  ENCE-OF: R-06866
c6a0: 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b  -39125 Freeblock
c6b0: 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e  s are always con
c6c0: 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20  nected in order 
c6d0: 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61  of.    ** increa
c6e0: 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a  sing offset. */.
c6f0: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
c700: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41  eSize-4 || pc<iA
c710: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a  ddr+4 ){.      *
c720: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
c730: 52 55 50 54 5f 50 47 4e 4f 28 70 50 67 2d 3e 70  RUPT_PGNO(pPg->p
c740: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gno);.      retu
c750: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
c760: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c770: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
c780: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
c790: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
c7a0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
c7b0: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
c7c0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
c7d0: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
c7e0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
c7f0: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
c800: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
c810: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
c820: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
c830: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
c840: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
c850: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
c860: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
c870: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
c880: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
c890: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
c8a0: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
c8b0: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
c8c0: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
c8d0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c8e0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
c8f0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
c900: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
c910: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c920: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20    }else if( x<4 
c930: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
c940: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
c950: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
c960: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
c970: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
c980: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
c990: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
c9a0: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
c9b0: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
c9c0: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
c9d0: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
c9e0: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
c9f0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
ca00: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
ca10: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
ca20: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
ca30: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
ca40: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
ca50: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
ca60: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
ca70: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
ca80: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
ca90: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
caa0: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
cab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
cac0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
cad0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
cae0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
caf0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
cb00: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
cb10: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
cb20: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
cb30: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
cb40: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
cb50: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
cb60: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
cb70: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
cb80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
cb90: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
cba0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
cbb0: 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28  [pc]);.  }while(
cbc0: 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e   pc );..  return
cbd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
cbe0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
cbf0: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
cc00: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
cc10: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
cc20: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
cc30: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
cc40: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
cc50: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
cc60: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
cc70: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
cc80: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
cc90: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
cca0: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
ccb0: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
ccc0: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
ccd0: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
cce0: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
ccf0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
cd00: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
cd10: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
cd20: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
cd30: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
cd40: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
cd50: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
cd60: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
cd70: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
cd80: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
cd90: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
cda0: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
cdb0: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
cdc0: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
cdd0: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
cde0: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
cdf0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
ce00: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
ce10: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
ce20: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
ce30: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
ce40: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
ce50: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
ce60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
ce70: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
ce80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
ce90: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
cea0: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
ceb0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
cec0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
ced0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
cee0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
cef0: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
cf00: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cf10: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
cf20: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
cf30: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
cf40: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
cf70: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
cf80: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rea */.  int rc 
cf90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cfb0: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
cfc0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61  code */.  int ga
cfd0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
cfe0: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
cff0: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
d000: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
d010: 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73  ntent */.  .  as
d020: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d030: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d040: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d050: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d060: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
d070: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d080: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d090: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
d0a0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
d0b0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
d0c0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
d0d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d0e0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
d0f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d100: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
d110: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
d120: 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d  e < (int)(pPage-
d130: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d140: 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  -8) );..  assert
d150: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
d160: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
d170: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
d180: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
d190: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
d1a0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
d1b0: 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35   assert( gap<=65
d1c0: 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  536 );.  /* EVID
d1d0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36  ENCE-OF: R-29356
d1e0: 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61  -02391 If the da
d1f0: 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35  tabase uses a 65
d200: 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69  536-byte page si
d210: 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ze.  ** and the 
d220: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69  reserved space i
d230: 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61  s zero (the usua
d240: 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65  l value for rese
d250: 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a  rved space).  **
d260: 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63   then the cell c
d270: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66  ontent offset of
d280: 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
d290: 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36  ants to be 65536
d2a0: 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
d2b0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20  that integer is 
d2c0: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
d2d0: 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79  stored in a 2-by
d2e0: 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a  te unsigned.  **
d2f0: 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76   integer, so a v
d300: 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65  alue of 0 is use
d310: 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  d in its place. 
d320: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
d330: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
d350: 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  <=(int)pPage->pB
d360: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
d370: 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67   /* Prevent by g
d380: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20  etAndInitPage() 
d390: 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  */.  if( gap>top
d3a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d   ){.    if( top=
d3b0: 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74  =0 && pPage->pBt
d3c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35  ->usableSize==65
d3d0: 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  536 ){.      top
d3e0: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
d3f0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
d400: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d410: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
d420: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  o);.    }.  }.. 
d430: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
d440: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
d450: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
d460: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
d470: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
d480: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
d490: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
d4a0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
d4b0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
d4c0: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
d4d0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
d4e0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
d4f0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
d500: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
d510: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
d520: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
d530: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
d540: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
d550: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
d560: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
d570: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
d580: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
d590: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
d5a0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
d5b0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
d5c0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
d5d0: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
d5e0: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
d5f0: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
d600: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
d610: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
d620: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
d630: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
d650: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
d660: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d670: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d680: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
d690: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
d6a0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
d6b0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
d6c0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
d6d0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
d6e0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
d6f0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
d700: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
d710: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
d720: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
d730: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d740: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
d750: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
d760: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
d770: 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50  pPage, MIN(4, pP
d780: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b  age->nFree - (2+
d790: 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66  nByte)));.    if
d7a0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d7b0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
d7c0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
d7d0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
d7e0: 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79  ssert( gap+2+nBy
d7f0: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
d800: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
d810: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
d820: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
d830: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
d840: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
d850: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
d860: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
d870: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
d880: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
d890: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
d8a0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
d8b0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
d8c0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
d8d0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
d8e0: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
d8f0: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
d900: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
d910: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
d920: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
d930: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
d940: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
d950: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
d960: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
d970: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
d980: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
d990: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
d9a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d9b0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
d9c0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
d9d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d9e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
d9f0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
da00: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
da10: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
da20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
da30: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
da40: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
da50: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
da60: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
da70: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
da80: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
da90: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
daa0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
dab0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
dac0: 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  t even though th
dad0: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
dae0: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
daf0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
db00: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
db10: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
db20: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
db30: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
db40: 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
db50: 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
db60: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
db70: 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
db80: 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
db90: 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
dba0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
dbb0: 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
dbc0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
dbd0: 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
dbe0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
dbf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dc00: 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
dc10: 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
dc20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dc30: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
dc40: 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
dc50: 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
dc60: 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
dc90: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
dca0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
dcb0: 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
dce0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
dcf0: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
dd00: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
dd30: 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
dd40: 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
dd50: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd70: 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
dd80: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
dd90: 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
dda0: 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
ddb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
ddc0: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
ddd0: 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73  ze */.  u32 iLas
dde0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  t = pPage->pBt->
ddf0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a  usableSize-4; /*
de00: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
de10: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
de20: 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64  et */.  u32 iEnd
de30: 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a   = iStart + iSiz
de40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
de50: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
de60: 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66   the iStart buff
de70: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
de80: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
de90: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a  age->aData;   /*
dea0: 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f   Page content */
deb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
dec0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
ded0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dee0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
def0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
df00: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
df10: 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74  UPT_DB || iStart
df20: 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
df30: 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c  et+6+pPage->chil
df40: 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73  dPtrSize );.  as
df50: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
df60: 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67   || iEnd <= pPag
df70: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
df80: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
df90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dfa0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
dfb0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
dfc0: 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20  t( iSize>=4 );  
dfd0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
dfe0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
dff0: 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
e000: 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f  iLast );..  /* O
e010: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
e020: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
e030: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
e040: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
e050: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
e060: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  abled */.  if( p
e070: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
e080: 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
e090: 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ECURE ){.    mem
e0a0: 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74  set(&data[iStart
e0b0: 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20  ], 0, iSize);.  
e0c0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  }..  /* The list
e0d0: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d   of freeblocks m
e0e0: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
e0f0: 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64  ing order.  Find
e100: 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20   the .  ** spot 
e110: 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72  on the list wher
e120: 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  e iStart should 
e130: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  be inserted..  *
e140: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
e150: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50  >hdrOffset;.  iP
e160: 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  tr = hdr + 1;.  
e170: 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d  if( data[iPtr+1]
e180: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72  ==0 && data[iPtr
e190: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65  ]==0 ){.    iFre
e1a0: 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68  eBlk = 0;  /* Sh
e1b0: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
e1c0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65  ase when the fre
e1d0: 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a  elist is empty *
e1e0: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  /.  }else{.    w
e1f0: 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20  hile( (iFreeBlk 
e200: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
e210: 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20  [iPtr]))<iStart 
e220: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
e230: 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a  eeBlk<iPtr+4 ){.
e240: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
e250: 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eBlk==0 ) break;
e260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e270: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e280: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
e290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e2a0: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
e2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e2c0: 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20  FreeBlk>iLast ) 
e2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e2e0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e2f0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
e300: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
e310: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
e320: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
e330: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
e340: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
e350: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
e360: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
e370: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
e380: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
e390: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
e3a0: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
e3b0: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
e3c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
e3d0: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
e3e0: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
e3f0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
e400: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
e410: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
e420: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
e430: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
e440: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
e450: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
e460: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
e470: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
e480: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
e490: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
e4a0: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
e4b0: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
e4c0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
e4d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
e4e0: 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42  iEnd > pPage->pB
e4f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
e500: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e510: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e520: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
e530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e540: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
e550: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
e560: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
e570: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
e580: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
e590: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
e5a0: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
e5b0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
e5c0: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
e5d0: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
e5e0: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
e5f0: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
e600: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
e610: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
e620: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
e630: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e640: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
e650: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
e660: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
e670: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
e680: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e690: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
e6a0: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
e6b0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
e6c0: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
e6d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e6e0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
e6f0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
e700: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
e710: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
e720: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
e730: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
e740: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
e750: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
e760: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
e770: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
e780: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e790: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
e7a0: 67 6e 6f 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  gno);.    data[h
e7b0: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
e7c0: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
e7d0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
e7e0: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
e7f0: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
e800: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
e810: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
e820: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e830: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
e840: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
e850: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
e860: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
e870: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
e880: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
e890: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
e8a0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
e8b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e8c0: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
e8d0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e8e0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
e8f0: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
e900: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
e910: 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
e920: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
e930: 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
e940: 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
e950: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
e960: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
e970: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70  , iStart);.    p
e980: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
e990: 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
e9a0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e9b0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
e9c0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50  iSize);.  }.  pP
e9d0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f  age->nFree += iO
e9e0: 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  rigSize;.  retur
e9f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ea00: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
ea10: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
ea20: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
ea30: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
ea40: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
ea50: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
ea60: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
ea70: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
ea80: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
ea90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
eaa0: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
eab0: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
eac0: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
ead0: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
eae0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
eaf0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
eb00: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
eb10: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
eb20: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
eb30: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
eb40: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
eb50: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
eb60: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
eb70: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
eb80: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
eb90: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
eba0: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
ebb0: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
ebc0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ebd0: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
ebe0: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
ebf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
ec00: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
ec10: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
ec20: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
ec30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ec40: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ec50: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ec60: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
ec70: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
ec80: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
ec90: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
eca0: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
ecb0: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
ecc0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
ecd0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
ece0: 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  .  pPage->xCellS
ecf0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
ed00: 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  r;.  pBt = pPage
ed10: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
ed20: 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46  gByte==(PTF_LEAF
ed30: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
ed40: 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  Y) ){.    /* EVI
ed50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39  DENCE-OF: R-0729
ed60: 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65 20  1-35328 A value 
ed70: 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e  of 5 (0x05) mean
ed80: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
ed90: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
eda0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
edb0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
edc0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
edd0: 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20  |PTF_INTKEY)==5 
ede0: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
edf0: 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30  CE-OF: R-26900-0
ee00: 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20  9176 A value of 
ee10: 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20  13 (0x0d) means 
ee20: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
ee30: 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20    ** leaf table 
ee40: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
ee50: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
ee60: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
ee70: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
ee80: 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
ee90: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
eea0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
eeb0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   ){.      pPage-
eec0: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b  >intKeyLeaf = 1;
eed0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
eee0: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
eef0: 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20  ParseCellPtr;.  
ef00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
ef10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
ef20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
ef30: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
ef40: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
ef50: 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65  oad;.      pPage
ef60: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
ef70: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
ef80: 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d  NoPayload;.    }
ef90: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
efa0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
efb0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
efc0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
efd0: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
efe0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
eff0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
f000: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f010: 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38  F: R-43316-37308
f020: 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30   A value of 2 (0
f030: 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x02) means the p
f040: 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  age is an.    **
f050: 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20   interior index 
f060: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f070: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f080: 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b  _ZERODATA)==2 );
f090: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f0a0: 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38  -OF: R-59615-428
f0b0: 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30  28 A value of 10
f0c0: 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68   (0x0a) means th
f0d0: 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20  e page is a.    
f0e0: 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d  ** leaf index b-
f0f0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
f100: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
f110: 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  ERODATA|PTF_LEAF
f120: 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61  )==10 );.    pPa
f130: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
f140: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f150: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
f160: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
f170: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
f180: 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70  lPtrIndex;.    p
f190: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
f1a0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
f1b0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
f1c0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
f1d0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
f1e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f1f0: 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20  : R-47608-56469 
f200: 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20  Any other value 
f210: 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70  for the b-tree p
f220: 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20  age type is.    
f230: 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  ** an error. */.
f240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f250: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
f260: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
f270: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  .  pPage->max1by
f280: 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d  tePayload = pBt-
f290: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
f2a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f2b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
f2c0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
f2d0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
f2e0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
f2f0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
f300: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
f310: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
f320: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
f330: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
f340: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
f350: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
f360: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
f370: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
f380: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
f390: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
f3a0: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
f3b0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
f3c0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
f3d0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
f3e0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
f3f0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
f400: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
f410: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
f420: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
f430: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
f440: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
f450: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
f460: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
f470: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
f480: 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72  ta[] */.  u8 hdr
f490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f4a0: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
f4b0: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
f4c0: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
f4d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
f4e0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
f4f0: 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ata */.  BtShare
f500: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
f510: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
f520: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
f530: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
f540: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
f550: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
f560: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
f570: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
f580: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
f590: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
f5a0: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
f5b0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  nter */.  int nF
f5c0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
f5d0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
f5e0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
f5f0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
f600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
f610: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
f620: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f630: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  a */.  int iCell
f640: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
f650: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
f660: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
f670: 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ffset */.  int i
f680: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
f690: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
f6a0: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
f6b0: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73   offset */..  as
f6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
f6d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f6e0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
f6f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f710: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f720: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
f730: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
f740: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
f750: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
f760: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
f770: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
f780: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
f790: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
f7a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
f7b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
f7c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
f7d0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
f7e0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
f7f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30  pPage->isInit==0
f800: 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   );..  pBt = pPa
f810: 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d  ge->pBt;.  hdr =
f820: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
f830: 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
f840: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45  e->aData;.  /* E
f850: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
f860: 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e  594-02890 The on
f870: 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f  e-byte flag at o
f880: 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69  ffset 0 indicati
f890: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72  ng.  ** the b-tr
f8a0: 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f  ee page type. */
f8b0: 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61  .  if( decodeFla
f8c0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
f8d0: 64 72 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  dr]) ){.    retu
f8e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f8f0: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
f900: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
f910: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
f920: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
f930: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
f940: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
f950: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
f960: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
f970: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
f980: 77 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  w = 0;.  usableS
f990: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
f9a0: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
f9b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
f9c0: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
f9d0: 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
f9e0: 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
f9f0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
fa00: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
fa10: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
fa20: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
fa30: 66 73 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  fset];.  pPage->
fa40: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
fa50: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
fa60: 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49  rSize];.  /* EVI
fa70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
fa80: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
fa90: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
faa0: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
fab0: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  tes.  ** the sta
fac0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
fad0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
fae0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
faf0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
fb00: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
fb10: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f  s 65536. */.  to
fb20: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
fb30: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
fb40: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
fb50: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
fb60: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
fb70: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
fb80: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
fb90: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
fba0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
fbb0: 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  */.  pPage->nCel
fbc0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
fbd0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
fbe0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
fbf0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
fc00: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
fc10: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
fc20: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
fc30: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
fc40: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
fc50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
fc60: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
fc70: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
fc80: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
fc90: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
fca0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
fcb0: 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
fcc0: 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
fcd0: 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
fce0: 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70  h is only.  ** p
fcf0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
fd00: 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
fd10: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
fd20: 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
fd30: 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74  he.  ** offset t
fd40: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
fd50: 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75  nt area will equ
fd60: 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  al the page size
fd70: 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20   minus the.  ** 
fd80: 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
fd90: 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73  d space. */.  as
fda0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
fdb0: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
fdc0: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
fdd0: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41  PT_DB );..  /* A
fde0: 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
fdf0: 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
fe00: 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
fe10: 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  past the end.  *
fe20: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
fe30: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
fe40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
fe50: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
fe60: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
fe70: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
fe80: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a  cell extends.  *
fe90: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
fea0: 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
feb0: 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
fec0: 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
fed0: 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  e .  ** returned
fee0: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   if it does..  *
fef0: 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  /.  iCellFirst =
ff00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ff10: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
ff20: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
ff30: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66  leSize - 4;.  if
ff40: 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
ff50: 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
ff60: 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  zeCk ){.    int 
ff70: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
ff80: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
ff90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
ffa0: 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ay */.    int sz
ffb0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
ffc0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
ffd0: 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
ffe0: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
fff0: 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st--;.    for(i=
10000 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
10010 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
10020 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
10030 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
10040 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
10050 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10060 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
10070 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10080 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
10090 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
100a0 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
100b0 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
100c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
100d0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
100e0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
100f0 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50   }.      sz = pP
10100 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
10110 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
10120 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10130 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
10140 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
10150 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
10160 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
10170 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10180 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
10190 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
101a0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
101b0 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
101c0 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20  Last++;.  }  .. 
101d0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
101e0 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
101f0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a   on the page.  *
10200 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10210 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65  -23588-34450 The
10220 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
10230 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69  r at offset 1 gi
10240 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61  ves the.  ** sta
10250 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
10260 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
10270 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
10280 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
10290 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  o.  ** freeblock
102a0 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74  s. */.  pc = get
102b0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
102c0 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64  1]);.  nFree = d
102d0 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
102e0 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65  ;  /* Init nFree
102f0 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63   to non-freebloc
10300 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a  k free space */.
10310 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20 20    if( pc>0 ){.  
10320 20 20 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65    u32 next, size
10330 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  ;.    if( pc<iCe
10340 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
10350 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10360 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49   R-55530-52930 I
10370 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
10380 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
10390 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  re will.      **
103a0 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
103b0 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66  ast one cell bef
103c0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72  ore the first fr
103d0 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  eeblock..      *
103e0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
103f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
10400 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
10410 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c   .    }.    whil
10420 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
10430 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
10440 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
10450 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65  eblock off the e
10460 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
10470 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
10480 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10490 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
104a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
104b0 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
104c0 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
104d0 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
104e0 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
104f0 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
10500 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
10510 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
10520 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
10530 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
10540 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10550 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ext>0 ){.      /
10560 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20  * Freeblock not 
10570 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
10580 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
10590 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
105a0 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
105b0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  no);.    }.    i
105c0 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69  f( pc+size>(unsi
105d0 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53  gned int)usableS
105e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
105f0 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65  Last freeblock e
10600 78 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65  xtends past page
10610 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72 65   end */.      re
10620 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10630 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
10640 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pgno);.    }.  }
10650 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
10660 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
10670 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
10680 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
10690 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
106a0 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
106b0 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
106c0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
106d0 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  tes within.  ** 
106e0 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
106f0 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
10700 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
10710 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
10720 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
10730 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
10740 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
10750 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
10760 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f  o.  ** serves to
10770 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
10780 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
10790 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
107a0 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72  -content.  ** ar
107b0 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
107c0 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
107d0 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
107e0 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  e page..  */.  i
107f0 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
10800 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
10810 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10820 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
10830 6f 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  o);.  }.  pPage-
10840 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
10850 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
10860 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  t);.  pPage->isI
10870 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
10880 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10890 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
108a0 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
108b0 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
108c0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
108d0 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
108e0 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
108f0 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
10900 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
10910 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
10920 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
10930 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10940 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10950 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
10960 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10970 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10980 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10990 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
109a0 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
109b0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
109c0 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
109d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
109e0 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
109f0 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10a00 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
10a10 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10a20 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10a30 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
10a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10a50 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
10a60 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10a70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10a80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10a90 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10aa0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10ab0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10ac0 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10ad0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10ae0 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10af0 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
10b00 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
10b10 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
10b20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
10b30 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
10b40 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
10b50 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10b60 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10b70 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10b80 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10b90 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10ba0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10bb0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10bc0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10bd0 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10be0 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10bf0 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
10c00 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
10c10 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
10c20 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
10c30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
10c40 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
10c50 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
10c60 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
10c70 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
10c80 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10c90 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
10ca0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
10cb0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
10cc0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
10cd0 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
10ce0 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
10cf0 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
10d00 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
10d10 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
10d20 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
10d30 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
10d40 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
10d50 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
10d60 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
10d70 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
10d80 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
10d90 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
10da0 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
10db0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
10dc0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
10dd0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
10de0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10df0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
10e00 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
10e10 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
10e20 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
10e30 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
10e40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
10e50 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
10e60 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
10e70 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
10e80 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
10e90 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
10ea0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
10eb0 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
10ec0 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
10ed0 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
10ee0 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
10ef0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10f00 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
10f10 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
10f20 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
10f30 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
10f40 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
10f50 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
10f60 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
10f70 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
10f80 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
10f90 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
10fa0 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
10fb0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
10fc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
10fd0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10fe0 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
10ff0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
11000 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
11010 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
11020 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
11030 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
11040 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
11050 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
11060 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
11070 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
11080 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
11090 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
110a0 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
110b0 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
110c0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
110d0 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
110e0 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
110f0 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
11100 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
11110 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
11120 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
11130 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
11140 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
11150 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
11160 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11170 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
11180 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
11190 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
111a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
111b0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
111c0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
111d0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
111e0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
111f0 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
11200 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
11210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
11220 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11230 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
11240 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
11250 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
11260 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
11270 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
11280 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
11290 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
112a0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
112b0 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
112c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
112d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
112e0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
112f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
11300 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11310 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
11320 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
11330 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11340 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
11350 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11360 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
11370 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
11380 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11390 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
113a0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
113b0 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
113c0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
113d0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
113e0 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
113f0 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
11400 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
11410 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
11420 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
11430 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
11440 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
11450 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
11460 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
11470 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
11480 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
11490 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
114a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
114b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
114c0 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
114d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
114e0 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
114f0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
11500 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
11510 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
11520 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
11530 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
11540 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11560 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11570 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
11580 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
11590 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
115a0 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
115b0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
115c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
115d0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
115e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
115f0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
11600 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
11610 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
11620 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
11630 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
11640 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
11650 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
11660 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
11670 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
11680 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
11690 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
116a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
116b0 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
116c0 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
116d0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43   it..**.** If pC
116e0 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ur!=0 then the p
116f0 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74  age is being fet
11700 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ched as part of 
11710 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a  a moveToChild().
11720 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64  ** call.  Do add
11730 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
11740 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
11750 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
11760 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20  ..** And if the 
11770 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69  fetch fails, thi
11780 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64  s routine must d
11790 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69  ecrement pCur->i
117a0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Page..**.** The 
117b0 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20  page is fetched 
117c0 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e  as read-write un
117d0 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74  less pCur is not
117e0 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20   NULL and is.** 
117f0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
11800 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  or..**.** If an 
11810 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
11820 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e  en *ppPage is un
11830 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
11840 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
11850 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
11860 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
11870 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
11880 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
11890 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
118a0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
118b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
118c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
118d0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11900 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
11910 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
11920 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
11930 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11940 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
11950 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72   here */.  BtCur
11960 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
11970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
11980 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20  rsor to receive 
11990 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c  the page, or NUL
119a0 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  L */.  int bRead
119b0 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  Only            
119c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
119d0 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70  or a read-only p
119e0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
119f0 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
11a00 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
11a10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11a20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
11a40 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d  r==0 || ppPage==
11a50 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a  &pCur->pPage );.
11a60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11a70 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
11a80 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
11a90 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
11aa0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
11ab0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
11ac0 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
11ad0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
11ae0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11af0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11b00 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11b10 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11b20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11b30 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
11b40 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
11b50 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62  ge**)&pDbPage, b
11b60 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28  ReadOnly);.  if(
11b70 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   rc ){.    goto 
11b80 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11b90 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  rror;.  }.  *ppP
11ba0 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11bb0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11bc0 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11bd0 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
11be0 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
11bf0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
11c00 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
11c10 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63  no, pBt);.    rc
11c20 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
11c30 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
11c40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c50 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
11c60 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11c70 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
11c80 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11ca0 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11cb0 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
11cc0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
11cd0 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  )->aData==sqlite
11ce0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11cf0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
11d00 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63  If obtaining a c
11d10 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20  hild page for a 
11d20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20  cursor, we must 
11d30 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
11d40 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  page is.  ** com
11d50 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
11d60 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20   root page. */. 
11d70 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a   if( pCur && ((*
11d80 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31  ppPage)->nCell<1
11d90 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
11da0 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72  ntKey!=pCur->cur
11db0 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  IntKey) ){.    r
11dc0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
11dd0 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20  PT_PGNO(pgno);. 
11de0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11df0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74  ppPage);.    got
11e00 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
11e10 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  _error;.  }.  re
11e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11e30 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
11e40 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75  error:.  if( pCu
11e50 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  r ){.    pCur->i
11e60 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72  Page--;.    pCur
11e70 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
11e80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
11e90 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  ge];.  }.  testc
11ea0 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
11eb0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
11ec0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
11ed0 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
11ee0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11ef0 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
11f00 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
11f10 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
11f20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
11f30 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
11f40 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
11f50 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11f60 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
11f70 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
11f80 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
11f90 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
11fa0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
11fb0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
11fc0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
11fd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11fe0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11ff0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
12000 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
12010 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12020 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
12030 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
12040 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
12050 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12060 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
12070 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
12080 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
12090 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
120a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74  ->pDbPage);.}.st
120b0 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
120c0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
120d0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
120e0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
120f0 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a  NotNull(pPage);.
12100 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
12110 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
12120 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
12130 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
12140 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
12150 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
12160 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
12170 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
12180 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
12190 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
121a0 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
121b0 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
121c0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
121d0 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
121e0 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
121f0 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
12200 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
12210 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
12220 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
12230 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
12240 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
12250 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
12260 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12270 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
12280 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
12290 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
122a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
122b0 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
122c0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
122d0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
122e0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
122f0 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
12300 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
12310 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
12320 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
12330 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
12340 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
12350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12360 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
12370 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
12380 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
12390 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
123a0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
123b0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
123c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
123d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
123e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
123f0 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
12400 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
12410 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
12420 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
12430 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
12440 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
12450 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
12460 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
12470 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
12480 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
12490 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
124a0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
124b0 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
124c0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
124d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
124e0 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
124f0 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
12500 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
12510 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12520 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
12530 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
12540 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
12550 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
12560 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
12570 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
12580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12590 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
125a0 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
125b0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
125c0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
125d0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
125e0 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
125f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12600 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
12610 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
12620 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
12630 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
12640 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12650 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
12660 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
12670 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
12680 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
12690 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
126a0 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
126b0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
126c0 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
126d0 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
126e0 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
126f0 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
12700 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
12710 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
12720 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
12730 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
12740 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
12750 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
12760 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
12770 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12780 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
12790 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
127a0 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
127b0 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
127c0 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
127d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
127e0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
127f0 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
12800 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
12810 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
12820 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
12830 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
12840 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
12850 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
12860 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
12870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
12880 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
12890 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
128a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
128b0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
128c0 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
128d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
128e0 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
128f0 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
12900 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
12910 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12920 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
12930 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
12940 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
12950 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
12960 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
12970 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
12980 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
12990 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
129a0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
129b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
129c0 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
129d0 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
129e0 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
129f0 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
12a00 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
12a10 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
12a20 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
12a30 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
12a40 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
12a50 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
12a60 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
12a70 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
12a80 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
12a90 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
12aa0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
12ab0 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
12ac0 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
12ad0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
12ae0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
12af0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
12b00 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
12b10 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
12b20 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
12b30 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
12b40 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
12b50 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
12b60 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
12b70 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
12b80 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
12b90 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
12ba0 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
12bb0 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
12bc0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
12bd0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
12be0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
12bf0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12c00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
12c10 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
12c20 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
12c30 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
12c40 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
12c50 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
12c60 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
12c70 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
12c80 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
12c90 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
12ca0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
12cb0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
12cc0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
12cd0 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
12ce0 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
12cf0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
12d00 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
12d10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12d20 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
12d30 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
12d40 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
12d50 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12d60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
12d70 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
12d80 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
12d90 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
12da0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
12db0 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
12dc0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
12dd0 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
12de0 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
12df0 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
12e00 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
12e10 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
12e20 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12e30 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
12e40 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12e50 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12e60 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
12e70 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
12e80 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
12e90 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12ea0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
12eb0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
12ec0 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
12ed0 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
12ee0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
12ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
12f00 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
12f10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
12f20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
12f30 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
12f40 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
12f50 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
12f60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12f70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
12f80 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
12f90 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
12fa0 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
12fb0 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
12fc0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
12fd0 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
12fe0 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
12ff0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
13000 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
13010 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
13020 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
13030 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
13040 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
13050 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
13060 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
13070 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
13080 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
13090 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
130a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
130b0 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
130c0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
130d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
130e0 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
130f0 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
13100 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
13110 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13120 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
13130 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
13140 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
13150 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
13160 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
13170 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
13180 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
13190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
131a0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
131b0 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
131c0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
131d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
131e0 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
131f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13200 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
13210 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
13220 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
13230 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
13240 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13250 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
13260 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
13270 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
13280 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
13290 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
132a0 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
132b0 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
132c0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
132d0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
132e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
132f0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
13300 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
13310 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
13320 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
13330 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
13340 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
13350 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
13360 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
13370 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13380 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
13390 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
133a0 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
133b0 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
133c0 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
133d0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
133e0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
133f0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
13400 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
13410 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
13420 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
13430 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
13440 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
13450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
13460 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
13470 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
13480 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
13490 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
134a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
134b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
134c0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
134d0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
134e0 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
134f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13500 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
13510 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
13520 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
13530 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
13540 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13550 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13560 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
13570 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
13580 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
13590 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
135a0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
135b0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
135c0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
135d0 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
135e0 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
135f0 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
13600 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
13610 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
13620 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
13630 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
13640 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
13650 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
13660 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13670 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
13680 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
13690 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
136a0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
136b0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
136c0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
136d0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
136e0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
136f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
13700 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
13710 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
13720 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
13730 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
13740 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
13750 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
13760 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13770 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
13780 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
13790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
137a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
137b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
137c0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
137d0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
137e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
137f0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
13800 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
13810 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
13820 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13830 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
13840 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
13850 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
13880 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
13890 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
138a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
138b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
138c0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
138d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
138e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
138f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13900 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13910 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
13920 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
13930 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
13940 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13950 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
13960 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
13970 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13980 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
13990 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
139a0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
139b0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
139c0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
139d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
139e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
139f0 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
13a00 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
13a10 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
13a20 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
13a30 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
13a40 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
13a50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13a60 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
13a70 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
13a80 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
13a90 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
13aa0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
13ab0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
13ac0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
13ad0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
13ae0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
13af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
13b00 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
13b10 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
13b20 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
13b30 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
13b40 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
13b50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13b60 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
13b70 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
13b80 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
13b90 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
13ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
13bb0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13bc0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
13bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
13be0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13bf0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
13c00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13c10 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13c30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
13c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
13c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
13c60 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
13c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13c80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
13c90 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
13ca0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
13cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
13cc0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13cd0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
13ce0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13cf0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13d00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13d10 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
13d20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
13d30 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
13d40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
13d50 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
13d60 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
13d70 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
13d80 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
13d90 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
13da0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
13db0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
13dc0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
13dd0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
13de0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
13df0 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
13e00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
13e10 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
13e20 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
13e30 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
13e40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
13e50 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13e60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
13e70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
13e80 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
13e90 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
13ea0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
13eb0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
13ec0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
13ed0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
13ee0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
13ef0 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
13f00 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
13f10 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
13f20 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
13f30 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
13f40 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
13f50 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
13f60 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13f70 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
13f80 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13f90 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
13fa0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
13fb0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
13fc0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
13fd0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
13fe0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
13ff0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
14000 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
14010 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
14020 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
14030 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
14040 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
14050 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
14060 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14070 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
14080 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14090 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
140a0 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
140d0 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73  (MemPage), flags
140e0 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
140f0 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
14100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14110 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14120 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
14130 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
14140 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
14150 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14160 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
14170 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
14180 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
14190 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
141a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
141b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
141c0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
141d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
141e0 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
141f0 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
14200 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
14210 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14220 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
14230 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
14240 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
14250 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
14260 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
14270 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
14280 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
14290 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
142a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
142b0 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
142c0 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
142d0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
142e0 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  NLY;.#if defined
142f0 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44  (SQLITE_SECURE_D
14300 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e  ELETE).    pBt->
14310 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14320 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
14330 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
14340 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45 5f  ITE_FAST_SECURE_
14350 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
14360 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14370 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e 64  _OVERWRITE;.#end
14380 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
14390 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
143a0 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
143b0 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
143c0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
143d0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
143e0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
143f0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
14400 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
14410 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
14420 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14440 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
14450 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
14460 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
14470 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
14480 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
14490 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
144a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
144b0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
144c0 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
144d0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
144e0 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
144f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
14500 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
14510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14520 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14530 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14540 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
14550 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
14560 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
14570 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
14580 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
14590 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
145a0 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
145b0 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
145c0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
145d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
145e0 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
145f0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
14600 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
14610 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
14620 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
14630 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
14640 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
14650 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
14660 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
14670 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
14680 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
14690 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
146a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
146b0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
146c0 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
146d0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
146e0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
146f0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14700 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
14710 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14720 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
14730 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
14740 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
14750 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14760 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
14770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14780 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14790 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
147a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
147b0 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
147c0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
147d0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
147e0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
147f0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
14800 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
14810 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
14820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14830 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
14840 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
14850 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
14860 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14870 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
14880 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
14890 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
148a0 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
148b0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
148c0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
148d0 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
148e0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
148f0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
14900 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
14910 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
14920 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
14930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14940 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
14950 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
14960 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
14970 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
14980 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
14990 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
149a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
149b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
149c0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
149d0 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
149e0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
149f0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
14a00 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
14a10 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
14a20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14a30 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
14a40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14a50 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
14a60 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
14a70 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
14a80 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
14a90 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
14aa0 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
14ab0 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
14ac0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  ;.    if( p->sha
14ad0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
14ae0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
14af0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
14b00 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
14b10 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
14b20 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
14b30 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14b40 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
14b50 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
14b60 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14b70 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
14b80 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
14b90 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
14ba0 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
14bb0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14bc0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14bd0 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
14be0 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
14bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
14c00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
14c10 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
14c20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14c30 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
14c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14c50 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14c60 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
14c70 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
14c80 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14c90 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14ca0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14cb0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
14cc0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14cd0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
14ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14cf0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14d00 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
14d10 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
14d20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14d30 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14d40 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14d50 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
14d60 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
14d70 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
14d80 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
14d90 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
14da0 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
14db0 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
14dc0 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
14dd0 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
14de0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
14df0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
14e00 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
14e10 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
14e20 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
14e30 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14e40 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
14e50 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
14e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
14e70 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
14e80 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
14e90 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
14ea0 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
14eb0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
14ec0 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
14ed0 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
14ee0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
14ef0 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70    if( (uptr)p->p
14f00 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70  Bt<(uptr)pSib->p
14f10 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14f20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
14f30 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
14f40 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
14f50 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
14f60 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
14f70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
14f80 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
14f90 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70  && (uptr)pSib->p
14fa0 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29  Next->pBt<(uptr)
14fb0 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
14fc0 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
14fd0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
14fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14ff0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
15000 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
15010 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
15020 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
15030 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
15040 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
15050 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
15060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15070 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
15080 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
15090 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
150a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
150b0 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
150c0 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
150d0 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
150e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
150f0 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
15100 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
15110 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
15120 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
15130 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
15140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
15150 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15160 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
15170 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
15180 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
15190 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20  ile *pFile;..   
151a0 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
151b0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
151c0 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
151d0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
151e0 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
151f0 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
15200 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
15210 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
15220 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
15230 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
15240 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
15250 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
15260 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
15270 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
15280 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
15290 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
152a0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
152b0 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
152c0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
152d0 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
152e0 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
152f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
15300 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
15310 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
15320 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
15330 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
15340 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
15350 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
15360 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74  PDB, (void*)&pBt
15370 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->db);.    }.  }
15380 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
15390 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
153a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
153b0 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
153c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
153d0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
153e0 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
153f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
15400 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
15410 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28  ConnectionCount(
15420 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20  *ppBtree)>0 );. 
15430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15440 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
15450 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
15460 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
15470 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
15480 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
15490 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
154a0 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
154b0 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
154c0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
154d0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
154e0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
154f0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
15500 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
15510 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
15520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
15530 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
15540 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
15550 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
15560 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15570 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
15580 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15590 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
155a0 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
155b0 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
155c0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
155d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
155e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
155f0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
15600 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
15610 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
15620 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15630 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
15640 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15650 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
15660 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
15670 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
15680 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
15690 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
156a0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
156b0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
156c0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
156d0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
156e0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
156f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
15700 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
15710 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
15720 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15730 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
15740 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
15750 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
15760 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
15770 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
15780 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
15790 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
157a0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
157b0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
157c0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
157d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
157e0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
157f0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
15800 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15810 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
15820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
15830 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
15840 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15850 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
15860 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
15870 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
15880 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
15890 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
158a0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
158b0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
158c0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
158d0 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
158e0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
158f0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
15900 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
15910 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
15920 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
15930 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
15940 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
15950 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
15960 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15970 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
15980 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
15990 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
159a0 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
159b0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
159c0 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
159d0 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
159e0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
159f0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
15a00 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
15a10 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
15a20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
15a30 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
15a40 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
15a50 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
15a60 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
15a70 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
15a80 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
15a90 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
15aa0 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
15ab0 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
15ac0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
15ad0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
15ae0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
15af0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
15b00 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
15b10 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15b20 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
15b30 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
15b40 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
15b50 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
15b60 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
15b70 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
15b80 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
15b90 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
15ba0 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
15bb0 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
15bc0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
15bd0 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
15be0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
15bf0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
15c00 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
15c10 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
15c20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
15c30 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
15c40 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
15c50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
15c60 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
15c70 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
15c80 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
15c90 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
15ca0 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
15cb0 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
15cc0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
15cd0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
15ce0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15cf0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
15d00 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
15d10 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
15d20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
15d30 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
15d40 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
15d50 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
15d60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
15d70 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
15d80 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
15d90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15da0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
15db0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
15dc0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
15dd0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
15de0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
15df0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
15e00 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
15e10 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
15e20 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
15e30 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
15e40 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
15e50 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
15e60 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
15e70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
15e80 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
15e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15ea0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
15eb0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
15ec0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
15ed0 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
15ee0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
15ef0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15f00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
15f10 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15f20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15f30 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
15f40 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
15f50 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
15f60 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
15f70 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
15f80 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15f90 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
15fa0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
15fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15fc0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
15fd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15fe0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
15ff0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
16000 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
16010 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
16020 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
16030 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
16040 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
16050 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
16060 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
16070 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
16080 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
16090 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
160a0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
160b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
160c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
160d0 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
160e0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
160f0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
16100 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
16110 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
16120 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
16130 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
16140 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
16150 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
16160 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
16170 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
16180 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
16190 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
161a0 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
161b0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
161c0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
161d0 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
161e0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
161f0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
16200 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
16210 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
16220 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
16230 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
16240 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
16250 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
16260 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
16270 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16280 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
16290 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
162a0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
162b0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b  >pPager, p->db);
162c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
162d0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
162e0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
162f0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
16300 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
16310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16320 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
16330 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
16340 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
16350 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
16360 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
16370 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16380 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16390 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
163a0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
163b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
163c0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
163d0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
163e0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
163f0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
16400 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
16410 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
16420 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
16430 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
16440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16450 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
16460 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69  ge the "soft" li
16470 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
16480 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
16490 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73  e cache..** Unus
164a0 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65  ed and unmodifie
164b0 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  d pages will be 
164c0 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68  recycled when th
164d0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
164e0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
164f0 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73  e exceeds this s
16500 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20  oft limit.  But 
16510 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
16520 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f  ** cache is allo
16530 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67  wed to grow larg
16540 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d  er than this lim
16550 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  it if it contain
16560 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73  s.** dirty pages
16570 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20   or pages still 
16580 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a  in active use..*
16590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
165a0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
165b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
165c0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
165d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
165e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
165f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16600 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16610 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16620 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
16630 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
16640 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
16650 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
16660 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16680 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
16690 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c  ge the "spill" l
166a0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
166b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
166c0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20  he cache..** If 
166d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
166e0 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73  ges exceeds this
166f0 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20   limit during a 
16700 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16710 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  n,.** the pager 
16720 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f  might attempt to
16730 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74   "spill" pages t
16740 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61  o the journal ea
16750 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20  rly in.** order 
16760 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72  to free up memor
16770 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  y..**.** The val
16780 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
16790 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
167a0 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20   size.  If zero 
167b0 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  is passed.** as 
167c0 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20  an argument, no 
167d0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
167e0 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69   to the spill si
167f0 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a  ze setting, so.*
16800 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f  * using mxPage o
16810 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20  f 0 is a way to 
16820 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
16830 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f  t spill size..*/
16840 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16850 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74  eSetSpillSize(Bt
16860 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
16870 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
16880 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16890 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
168a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
168b0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
168c0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
168d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
168e0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50    res = sqlite3P
168f0 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
16900 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
16910 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
16920 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16930 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
16940 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16950 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
16960 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
16970 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
16980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16990 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
169a0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
169b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
169c0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
169d0 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
169e0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
169f0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
16a00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16a10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16a20 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
16a30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
16a40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16a50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
16a60 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
16a70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
16a80 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
16a90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16ab0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
16ac0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
16ad0 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  E>0 */../*.** Ch
16ae0 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
16af0 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
16b00 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
16b10 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
16b20 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
16b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
16b40 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
16b50 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
16b60 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
16b70 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
16b80 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
16b90 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
16ba0 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
16bb0 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
16bc0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
16bd0 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
16be0 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
16bf0 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
16c00 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
16c10 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
16c20 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
16c30 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
16c40 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
16c50 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
16c60 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
16c70 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
16c80 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
16c90 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
16ca0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
16cb0 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
16cc0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72  te3BtreeSetPager
16cd0 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a  Flags(.  Btree *
16ce0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16cf0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
16d00 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
16d10 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73  evel on */.  uns
16d20 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
16d30 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50      /* Various P
16d40 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  AGER_* flags */.
16d50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16d60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16d70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16d80 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16d90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16da0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16db0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16dc0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
16dd0 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b  Pager, pgFlags);
16de0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16df0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
16e10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
16e20 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
16e30 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
16e40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16e50 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
16e60 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
16e70 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
16e80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
16e90 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
16ea0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
16eb0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
16ec0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
16ed0 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
16ee0 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
16ef0 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
16f00 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
16f10 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
16f20 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
16f30 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
16f40 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
16f50 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
16f60 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
16f70 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
16f80 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
16f90 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
16fa0 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
16fb0 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
16fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
16fd0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
16fe0 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
16ff0 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
17000 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
17010 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
17020 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
17030 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
17040 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
17050 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
17060 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
17070 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
17080 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
17090 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
170a0 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
170b0 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
170c0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
170d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
170e0 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
170f0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
17100 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
17110 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
17120 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
17130 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
17140 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
17150 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17160 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
17170 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17180 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
17190 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
171a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
171b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
171c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
171d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
171e0 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
171f0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
17200 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17210 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  r(p);.#if SQLITE
17220 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
17230 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f   nReserve>pBt->o
17240 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
17250 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
17260 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72  rve = (u8)nReser
17270 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ve;.#endif.  if(
17280 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
17290 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
172a0 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
172b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
172c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
172d0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
172e0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
172f0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
17300 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
17310 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
17320 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
17330 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
17340 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
17350 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
17360 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
17370 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
17380 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
17390 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
173a0 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
173b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
173c0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
173d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
173e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
173f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
17400 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
17410 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
17420 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
17430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17440 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
17450 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
17460 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
17470 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
17480 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
17490 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
174a0 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
174b0 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
174c0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
174d0 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
174e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
174f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17500 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17510 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
17520 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
17530 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17540 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
17550 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
17560 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
17570 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
17580 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
17590 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
175a0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
175b0 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
175c0 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
175d0 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
175e0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
175f0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
17600 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
17610 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
17620 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
17630 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
17640 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
17650 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
17660 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
17670 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
17680 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
17690 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
176a0 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
176b0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
176c0 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
176d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
176e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
176f0 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
17700 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
17710 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
17720 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
17730 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
17740 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
17750 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
17760 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
17770 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
17780 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
17790 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
177a0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
177b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
177c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
177d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
177e0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
177f0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
17800 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
17810 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
17820 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17830 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17840 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
17850 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
17860 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
17870 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
17880 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
17890 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
178a0 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
178b0 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
178c0 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  extensions..**.*
178d0 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  * If SQLITE_HAS_
178e0 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64  MUTEX is defined
178f0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
17900 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
17910 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74  .** greater of t
17920 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72  he current reser
17930 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68  ved space and th
17940 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73  e maximum reques
17950 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73  ted.** reserve s
17960 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pace..*/.int sql
17970 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69  ite3BtreeGetOpti
17980 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65  malReserve(Btree
17990 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
179a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
179b0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
179c0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
179d0 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23  rveNoMutex(p);.#
179e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
179f0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70  _CODEC.  if( n<p
17a00 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
17a10 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70  serve ) n = p->p
17a20 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17a30 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ve;.#endif.  sql
17a40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
17a60 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  .../*.** Set the
17a70 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
17a80 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
17a90 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
17aa0 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
17ab0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
17ac0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
17ad0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
17ae0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
17af0 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
17b00 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
17b10 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17b20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17b30 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
17b40 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
17b50 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
17b60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17b70 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
17b80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
17b90 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
17ba0 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
17bb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17bc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17bd0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn n;.}../*.** C
17be0 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 73  hange the values
17bf0 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45 43   for the BTS_SEC
17c00 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42  URE_DELETE and B
17c10 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61  TS_OVERWRITE fla
17c20 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77  gs:.**.**    new
17c30 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42 6f  Flag==0       Bo
17c40 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
17c50 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45  LETE and BTS_OVE
17c60 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61 72  RWRITE are clear
17c70 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  ed.**    newFlag
17c80 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53 45  ==1       BTS_SE
17c90 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74 20  CURE_DELETE set 
17ca0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
17cb0 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20  E is cleared.** 
17cc0 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20     newFlag==2   
17cd0 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44      BTS_SECURE_D
17ce0 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61 6e  ELETE cleared an
17cf0 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
17d00 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77  is set.**    new
17d10 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f  Flag==(-1)    No
17d20 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54   changes.**.** T
17d30 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
17d40 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20 6e   as a query if n
17d50 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20 74  ewFlag is less t
17d60 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57  han zero.**.** W
17d70 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ith BTS_OVERWRIT
17d80 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20 63  E set, deleted c
17d90 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77 72  ontent is overwr
17da0 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20  itten by zeros, 
17db0 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20  but.** freelist 
17dc0 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20 6e  leaf pages are n
17dd0 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  ot written back 
17de0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
17df0 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a    Thus in-page.*
17e00 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  * deleted conten
17e10 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62 75  t is cleared, bu
17e20 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65 74  t freelist delet
17e30 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ed content is no
17e40 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54  t..**.** With BT
17e50 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2c  S_SECURE_DELETE,
17e60 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69   operation is li
17e70 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  ke BTS_OVERWRITE
17e80 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
17e90 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65 6c  on.** that freel
17ea0 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
17eb0 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  re written back 
17ec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17ed0 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a  e, increasing.**
17ee0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64   the amount of d
17ef0 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20  isk I/O..*/.int 
17f00 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
17f10 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
17f20 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
17f30 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
17f40 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
17f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17f60 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
17f70 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  t( BTS_OVERWRITE
17f80 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  ==BTS_SECURE_DEL
17f90 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65 72  ETE*2 );.  asser
17fa0 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55  t( BTS_FAST_SECU
17fb0 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52 49  RE==(BTS_OVERWRI
17fc0 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44 45  TE|BTS_SECURE_DE
17fd0 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20 6e  LETE) );.  if( n
17fe0 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
17ff0 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
18000 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53  s &= ~BTS_FAST_S
18010 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42  ECURE;.    p->pB
18020 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
18030 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
18040 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20  *newFlag;.  }.  
18050 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
18060 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
18070 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45 43  _SECURE)/BTS_SEC
18080 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71  URE_DELETE;.  sq
18090 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
180a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
180b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
180c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
180d0 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
180e0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
180f0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
18100 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
18110 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
18120 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
18130 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
18140 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
18150 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
18160 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
18170 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
18180 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
18190 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
181a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
181b0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
181c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
181d0 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
181e0 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
181f0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
18200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18210 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
18220 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
18230 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
18240 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18250 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
18260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
18270 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
18280 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
18290 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
182a0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
182b0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
182c0 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
182d0 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
182e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
182f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
18300 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
18310 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
18320 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
18330 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
18340 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
18350 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
18360 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18370 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18390 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
183a0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
183b0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
183c0 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
183d0 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
183e0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
183f0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
18400 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
18410 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
18420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
18430 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18440 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
18450 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
18460 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
18470 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18480 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
18490 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
184a0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
184b0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
184c0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
184d0 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
184e0 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
184f0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
18500 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
18510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18520 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18530 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
18540 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
18550 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65   has not set the
18560 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f   safety-level fo
18570 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
18580 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73  connection.** us
18590 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63  ing "PRAGMA sync
185a0 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66  hronous", and if
185b0 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
185c0 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
185d0 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76  .** set to the v
185e0 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
185f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
18600 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
18610 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20  eter,.** set it 
18620 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  so..*/.#if SQLIT
18630 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
18640 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
18650 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
18660 4f 4e 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69  ONOUS.static voi
18670 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
18680 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
18690 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
186a0 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
186b0 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
186c0 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
186d0 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
186e0 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
186f0 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
18700 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18710 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18720 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
18730 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
18740 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
18750 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
18760 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
18770 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
18780 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
18790 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
187a0 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
187b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
187c0 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
187d0 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
187e0 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
187f0 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
18800 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
18810 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
18820 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
18830 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
18840 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
18850 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
18860 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
18870 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
18880 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18890 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
188a0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
188b0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
188c0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
188d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
188e0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
188f0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
18900 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
18910 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
18920 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
18930 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
18940 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
18950 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
18960 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
18970 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
18980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
18990 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
189a0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
189b0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
189c0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
189d0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
189e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
189f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
18a00 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
18a10 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
18a20 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
18a30 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
18a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
18a50 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
18a60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18a70 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18a80 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
18a90 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
18aa0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
18ab0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18ac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
18ad0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
18ae0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
18af0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18b00 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
18b10 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
18b20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18b30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18b40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18b50 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
18b60 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
18b70 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
18b80 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
18b90 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18ba0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18bb0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
18bc0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
18bd0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
18be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18bf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
18c00 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
18c10 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
18c20 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
18c30 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
18c40 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
18c50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
18c60 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
18c70 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
18c80 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
18c90 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
18ca0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
18cb0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
18cc0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
18cd0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
18ce0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
18cf0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
18d00 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
18d10 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
18d20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
18d30 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
18d40 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
18d50 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
18d60 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
18d70 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
18d80 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
18d90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18da0 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
18db0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
18dc0 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
18dd0 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
18de0 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
18df0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18e00 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
18e10 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
18e20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
18e30 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
18e40 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
18e50 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
18e60 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
18e70 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
18e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18e90 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18ea0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
18eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
18ec0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
18ed0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
18ee0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
18ef0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
18f00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
18f10 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
18f20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18f30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18f40 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
18f50 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
18f60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
18f70 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
18f80 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
18f90 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
18fa0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18fb0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18fc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
18fd0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
18fe0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
18ff0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
19000 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
19010 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
19020 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
19030 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
19040 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
19050 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
19060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
19070 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
19080 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
19090 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
190a0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
190b0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
190c0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
190d0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
190e0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
190f0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
19100 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
19110 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
19120 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
19130 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
19140 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
19150 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
19160 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
19170 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
19180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19190 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
191a0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
191b0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
191c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
191d0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
191e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
191f0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
19200 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
19210 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19230 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19240 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
19250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19260 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19270 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
19280 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
19290 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20  RONOUS+1);.     
192a0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30     if( isOpen==0
192b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
192c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
192d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
192e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
192f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19300 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19310 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
19320 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44  else{.      setD
19330 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
19340 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
19350 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  LT_SYNCHRONOUS+1
19360 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
19370 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19380 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38  -OF: R-15465-208
19390 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  13 The maximum a
193a0 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64  nd minimum embed
193b0 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20  ded payload.    
193c0 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64  ** fractions and
193d0 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61   the leaf payloa
193e0 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65  d fraction value
193f0 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32  s must be 64, 32
19400 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a  , and 32..    **
19410 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
19420 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
19430 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
19440 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
19450 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
19460 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
19470 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
19480 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
19490 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
194a0 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
194b0 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
194c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
194d0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
194e0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
194f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
19500 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
19510 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
19520 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
19530 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
19540 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
19550 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
19560 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
19570 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
19580 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
19590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
195a0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67  file. */.    pag
195b0 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
195c0 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
195d0 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a  17]<<16);.    /*
195e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
195f0 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20  25008-21688 The 
19600 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69  size of a page i
19610 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  s a power of two
19620 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20  .    ** between 
19630 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e  512 and 65536 in
19640 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20  clusive. */.    
19650 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
19660 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
19670 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
19680 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
19690 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
196a0 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
196b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
196c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
196d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
196e0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
196f0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  7)==0 );.    /* 
19700 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19710 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22  9310-51205 The "
19720 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20  reserved space" 
19730 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79  size in the 1-by
19740 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  te.    ** intege
19750 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69  r at offset 20 i
19760 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19770 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
19780 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
19790 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f   ** each page to
197a0 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74   reserve for ext
197b0 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a  ensions. .    **
197c0 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
197d0 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
197e0 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
197f0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
19800 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  on is.    ** det
19810 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
19820 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
19830 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
19840 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
19850 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  0.    ** into th
19860 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19870 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75  header. */.    u
19880 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
19890 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
198a0 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
198b0 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
198c0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
198d0 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
198e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
198f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19900 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
19910 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
19920 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
19930 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
19940 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
19950 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
19960 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
19970 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
19980 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
19990 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
199a0 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
199b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
199c0 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
199d0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
199e0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
199f0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
19a00 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
19a10 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
19a20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19a30 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
19a40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
19a50 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
19a60 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
19a70 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
19a80 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
19a90 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
19aa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
19ab0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
19ac0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
19ad0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
19b00 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  ze-usableSize);.
19b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19b20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19b30 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
19b40 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
19b50 65 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ema)==0 && nPage
19b60 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
19b70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19b80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19b90 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19ba0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19bb0 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
19bc0 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
19bd0 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
19be0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
19bf0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
19c00 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
19c10 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
19c20 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
19c30 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
19c40 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
19c50 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
19c60 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
19c70 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
19c80 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
19c90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
19ca0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
19cc0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
19cd0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
19ce0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
19cf0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
19d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
19d10 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
19d20 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
19d30 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
19d40 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
19d50 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
19d60 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
19d70 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
19d80 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
19d90 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
19da0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
19db0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
19dc0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
19dd0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
19de0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
19df0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
19e00 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
19e10 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
19e20 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
19e30 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
19e40 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
19e50 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
19e60 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
19e70 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
19e80 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
19e90 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
19ea0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
19eb0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
19ec0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
19ed0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
19ee0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
19ef0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
19f00 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
19f10 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
19f20 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
19f30 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
19f40 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
19f50 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
19f60 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
19f70 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
19f80 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
19f90 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
19fa0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
19fb0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
19fc0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
19fd0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
19fe0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
19ff0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1a000 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
1a010 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1a020 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
1a030 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1a040 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
1a050 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
1a060 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
1a070 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1a080 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
1a090 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
1a0a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1a0b0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
1a0c0 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
1a0d0 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
1a0e0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1a0f0 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
1a100 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
1a110 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
1a120 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
1a130 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1a140 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
1a150 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
1a160 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
1a170 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
1a180 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1a190 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1a1a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
1a1b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
1a1c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1a1d0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
1a1e0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
1a1f0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1a200 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
1a210 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a220 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
1a230 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
1a240 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
1a250 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
1a260 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
1a270 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
1a280 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
1a290 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
1a2a0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
1a2b0 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
1a2c0 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
1a2d0 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
1a2e0 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
1a2f0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
1a300 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
1a310 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
1a320 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
1a330 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1a340 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1a350 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
1a360 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
1a370 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43  the database.  C
1a380 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68  ursors that.** h
1a390 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64  ave been tripped
1a3a0 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52   into the CURSOR
1a3b0 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65  _FAULT state are
1a3c0 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f   not counted..*/
1a3d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
1a3e0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74  tValidCursors(Bt
1a3f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
1a400 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75   wrOnly){.  BtCu
1a410 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
1a420 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
1a430 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
1a440 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
1a450 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
1a460 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( (wrOnly==0 ||
1a470 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
1a480 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
1a490 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70  g)!=0).     && p
1a4a0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
1a4b0 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
1a4c0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
1a4d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1a4e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1a4f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
1a500 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
1a510 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
1a520 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
1a530 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
1a540 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
1a550 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
1a560 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1a570 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
1a580 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1a590 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a5a0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
1a5b0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
1a5c0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
1a5d0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
1a5e0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
1a5f0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
1a600 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
1a610 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1a620 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
1a630 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
1a640 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1a650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a660 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1a670 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1a680 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1a690 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
1a6a0 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
1a6b0 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
1a6c0 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
1a6d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a6e0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
1a6f0 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
1a700 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1a710 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1a720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1a730 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
1a740 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1a750 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1a760 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
1a770 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
1a780 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  e1 = 0;.    rele
1a790 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
1a7a0 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Page1);.  }.}../
1a7b0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
1a7c0 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
1a7d0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
1a7e0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
1a7f0 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
1a800 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
1a810 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
1a820 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
1a830 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
1a840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
1a850 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
1a860 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
1a870 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
1a880 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
1a890 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1a8a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a8b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a8c0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
1a8d0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
1a8e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a8f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
1a900 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1a910 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
1a920 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
1a930 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
1a940 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a950 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
1a960 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1a970 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
1a980 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
1a990 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
1a9a0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
1a9b0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
1a9c0 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
1a9d0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
1a9e0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
1a9f0 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
1aa00 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
1aa10 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
1aa20 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1aa30 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
1aa40 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
1aa50 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
1aa60 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
1aa70 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
1aa80 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
1aa90 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
1aaa0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
1aab0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
1aac0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
1aad0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
1aae0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
1aaf0 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
1ab00 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
1ab10 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
1ab20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
1ab30 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
1ab40 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
1ab50 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
1ab60 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
1ab70 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
1ab80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ab90 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
1aba0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
1abb0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
1abc0 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
1abd0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1abe0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
1abf0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1ac00 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
1ac10 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
1ac20 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
1ac30 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
1ac40 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
1ac50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
1ac60 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
1ac70 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
1ac80 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
1ac90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1aca0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1acb0 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
1acc0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1acd0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
1ace0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
1acf0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
1ad00 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
1ad10 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
1ad20 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
1ad30 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
1ad40 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
1ad50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
1ad60 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
1ad70 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
1ad80 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
1ad90 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1ada0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1adb0 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
1adc0 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
1add0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
1ade0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1adf0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1ae00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
1ae10 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
1ae20 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1ae30 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
1ae40 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
1ae50 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
1ae60 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
1ae70 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
1ae80 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
1ae90 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
1aea0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1aeb0 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
1aec0 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
1aed0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1aee0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
1aef0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
1af00 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
1af10 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
1af20 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
1af30 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
1af40 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
1af50 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
1af60 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
1af70 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1af80 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
1af90 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
1afa0 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
1afb0 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
1afc0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1afd0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1afe0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
1aff0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
1b000 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
1b010 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1b020 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
1b030 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b040 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
1b050 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
1b060 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1b070 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
1b080 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1b090 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
1b0a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b0b0 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
1b0c0 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
1b0d0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
1b0e0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1b0f0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
1b100 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1b110 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
1b120 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b130 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
1b140 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b150 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
1b160 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
1b170 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
1b180 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
1b190 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
1b1a0 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
1b1b0 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
1b1c0 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
1b1d0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
1b1e0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
1b1f0 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
1b200 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
1b210 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
1b220 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
1b230 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
1b240 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
1b250 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
1b260 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
1b270 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
1b280 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
1b290 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
1b2a0 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
1b2b0 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
1b2c0 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
1b2d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
1b2e0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
1b2f0 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
1b300 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
1b310 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
1b320 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
1b330 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
1b340 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
1b350 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
1b360 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
1b370 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
1b380 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
1b390 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
1b3a0 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
1b3b0 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
1b3c0 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
1b3d0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
1b3e0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
1b3f0 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
1b400 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
1b410 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1b420 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
1b430 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
1b440 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
1b450 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
1b460 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
1b470 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
1b480 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
1b490 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
1b4a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b4b0 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
1b4c0 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
1b4d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1b4e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1b4f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b500 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1b510 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1b520 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b530 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1b540 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1b550 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1b560 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1b570 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1b580 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1b590 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1b5a0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1b5b0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1b5c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1b5d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1b5e0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1b5f0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1b600 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1b610 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1b620 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1b630 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1b640 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b650 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1b660 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1b670 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1b680 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
1b690 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
1b6a0 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
1b6b0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
1b6c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
1b6d0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1b6e0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1b6f0 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
1b700 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b710 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1b720 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1b730 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1b740 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1b750 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71  CACHE.  {.    sq
1b760 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
1b770 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f  0;.    /* If ano
1b780 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
1b790 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
1b7a0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
1b7b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
1b7c0 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
1b7d0 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
1b7e0 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
1b7f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1b800 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  n is.    ** requ
1b810 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
1b820 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20  LITE_LOCKED..   
1b830 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66   */.    if( (wrf
1b840 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
1b850 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1b860 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20  _WRITE).     || 
1b870 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1b880 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
1b890 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42  .    ){.      pB
1b8a0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1b8b0 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c  ter->db;.    }el
1b8c0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
1b8d0 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20  ){.      BtLock 
1b8e0 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f  *pIter;.      fo
1b8f0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1b900 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1b910 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1b920 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1b930 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
1b940 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b            pBlock
1b950 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
1b960 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1b970 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b990 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b     if( pBlock ){
1b9a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1b9b0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
1b9c0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
1b9d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b9e0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
1b9f0 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ACHE;.      goto
1ba00 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1ba10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1ba20 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1ba30 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1ba40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1ba50 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1ba60 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1ba70 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1ba80 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1ba90 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1baa0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1bab0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1bac0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1bad0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1bae0 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1baf0 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1bb00 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1bb10 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1bb20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1bb30 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1bb40 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1bb50 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1bb60 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1bb70 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1bb80 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1bb90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1bba0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1bbb0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1bbc0 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1bbd0 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1bbe0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1bbf0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1bc00 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1bc10 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1bc20 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1bc30 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1bc40 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1bc50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1bc60 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1bc70 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1bc80 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1bc90 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1bca0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1bcb0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1bcc0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1bcd0 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1bce0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1bcf0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1bd00 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1bd10 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1bd20 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1bd30 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1bd40 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1bd50 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1bd60 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1bd70 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1bd80 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1bd90 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1bda0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1bdb0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1bdc0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1bdd0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1bde0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1bdf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1be00 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1be10 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1be20 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1be30 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
1be40 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
1be50 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
1be60 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
1be70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1be80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1be90 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1bea0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1beb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1bec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
1bee0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1bef0 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
1bf00 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
1bf10 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1bf20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1bf30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1bf40 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
1bf50 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
1bf60 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
1bf70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bf80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
1bf90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1bfa0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
1bfb0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
1bfc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bfd0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1bfe0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
1bff0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
1c000 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1c010 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
1c020 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
1c030 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
1c040 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
1c050 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
1c060 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
1c070 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1c080 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
1c090 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
1c0a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1c0b0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1c0c0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
1c0d0 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
1c0e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
1c0f0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
1c100 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1c110 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c120 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
1c130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c140 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1c150 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1c160 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
1c170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c180 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1c1a0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
1c1b0 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
1c1c0 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
1c1d0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1c1e0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
1c1f0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
1c200 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1c210 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
1c220 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
1c230 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
1c240 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
1c250 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
1c260 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
1c270 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
1c280 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
1c290 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
1c2a0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
1c2b0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
1c2c0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
1c2d0 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
1c2e0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
1c2f0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
1c300 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
1c310 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
1c320 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
1c330 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
1c340 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
1c350 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
1c360 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1c370 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
1c380 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1c390 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
1c3a0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
1c3b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1c3c0 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
1c3d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c3e0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1c3f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1c400 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c410 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1c420 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1c430 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1c440 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
1c450 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c460 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
1c470 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
1c480 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1c490 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1c4a0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1c4b0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1c4c0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1c4d0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1c4e0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1c4f0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1c500 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1c510 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1c520 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1c530 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1c540 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1c550 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1c560 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1c570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c580 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1c590 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1c5a0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1c5b0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1c5c0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1c5d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c5e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1c5f0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1c600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1c610 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1c620 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1c630 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1c640 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1c650 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1c660 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1c670 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1c680 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1c690 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1c6a0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1c6b0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1c6c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1c6d0 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1c6e0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1c6f0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1c700 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1c730 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1c740 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c770 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1c780 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1c790 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c7b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1c7c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c7d0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1c7e0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1c7f0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1c800 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1c810 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1c820 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c830 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1c840 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1c850 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1c860 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1c870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1c880 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20  urn rc;.  nCell 
1c890 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1c8a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1c8b0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1c8c0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1c8d0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
1c8e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
1c8f0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1c900 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
1c910 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1c920 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
1c930 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1c940 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
1c950 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1c960 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1c970 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1c980 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1c990 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c9a0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
1c9b0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1c9c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1c9d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1c9e0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
1c9f0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1ca00 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1ca10 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1ca20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1ca30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1ca40 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1ca50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1ca60 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1ca70 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1ca80 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1ca90 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1caa0 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1cab0 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1cac0 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1cad0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1cae0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1caf0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1cb00 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1cb10 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1cb20 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1cb30 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1cb50 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1cb60 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1cb70 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1cb80 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1cb90 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1cba0 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1cbd0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1cbe0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1cbf0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1cc00 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1cc10 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1cc20 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1cc30 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1cc40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1cc50 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1cc60 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1cc70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1cc80 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1cc90 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1cca0 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1ccb0 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1ccc0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1ccd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1cce0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1ccf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1cd00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1cd10 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1cd20 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1cd30 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1cd40 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1cd50 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1cd60 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1cd70 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1cd80 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1cd90 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1cda0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1cdb0 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1cdc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cdd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
1cde0 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
1cdf0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
1ce00 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1ce10 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
1ce20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1ce30 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1ce40 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1ce50 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1ce60 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1ce70 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1ce80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1ce90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1cea0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1ceb0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1cec0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1ced0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1cee0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1cef0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1cf00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1cf10 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1cf20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1cf30 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1cf40 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1cf50 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1cf60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1cf70 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1cf80 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
1cf90 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b        if( pCell+
1cfa0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61  info.nSize > pPa
1cfb0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1cfc0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1cfd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cfe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1cff0 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
1d000 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1d020 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
1d030 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1d040 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  ize-4) ){.      
1d050 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1d060 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1d070 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  4, iTo);.       
1d080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d0a0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1d0b0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
1d0c0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
1d0d0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
1d0e0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
1d0f0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1d100 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1d110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d120 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
1d130 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
1d140 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
1d150 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
1d160 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1d170 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1d180 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
1d190 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
1d1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d1b0 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
1d1c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
1d1d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d1e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1d1f0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1d200 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1d210 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d220 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1d230 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1d240 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1d250 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1d260 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1d270 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1d280 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1d290 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1d2a0 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1d2b0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1d2c0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1d2d0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1d2e0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1d2f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1d300 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1d310 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1d320 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1d330 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1d340 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1d350 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1d360 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1d370 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1d380 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1d390 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1d3a0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1d3b0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1d3c0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1d3d0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1d3e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1d3f0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1d400 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1d410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1d420 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1d430 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1d440 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1d450 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1d460 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1d470 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1d480 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1d490 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1d4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d4b0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1d4c0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1d4d0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1d4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1d4f0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1d500 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1d510 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1d520 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1d530 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1d540 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1d550 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1d560 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1d570 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1d580 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1d590 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1d5a0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1d5b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1d5c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1d5d0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1d5e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1d5f0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1d600 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1d610 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1d620 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1d630 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d640 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d650 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d660 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1d670 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1d680 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1d690 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1d6a0 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1d6b0 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1d6c0 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1d6d0 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1d6e0 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1d6f0 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1d700 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1d710 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1d720 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1d730 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1d740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1d750 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1d760 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1d770 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1d780 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1d790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d7a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d7b0 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1d7c0 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1d7d0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1d7e0 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1d7f0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1d800 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1d810 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1d820 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1d830 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1d840 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1d850 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1d860 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1d870 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1d880 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1d890 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1d8a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1d8b0 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1d8c0 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1d8d0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1d8e0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1d8f0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1d900 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1d910 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1d920 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1d930 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1d940 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1d950 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1d960 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d970 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1d980 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d990 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1d9a0 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1d9b0 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1d9c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d9d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d9e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d9f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1da00 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1da10 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1da20 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1da30 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1da40 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1da50 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1da60 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1da70 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1da80 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1da90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1daa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1dab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1dac0 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1dad0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1dae0 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1daf0 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1db00 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1db10 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1db20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1db30 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1db40 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1db50 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1db60 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1db70 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1db80 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1db90 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1dba0 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1dbb0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1dbc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dbd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1dbe0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1dbf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1dc00 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1dc10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1dc20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dc30 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1dc40 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1dc50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1dc60 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1dc70 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1dc80 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1dc90 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1dca0 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1dcb0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1dcc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1dcd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dce0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1dcf0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1dd00 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1dd10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1dd20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1dd30 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1dd40 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1dd50 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1dd60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1dd70 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1dd80 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1dd90 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1dda0 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1ddb0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1ddc0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1ddd0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1dde0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1ddf0 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1de00 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1de10 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1de20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1de30 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1de40 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1de50 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1de60 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1de70 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1de80 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1de90 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1dea0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1deb0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1dec0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1ded0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1dee0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1def0 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1df00 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1df10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1df20 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1df30 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1df40 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1df50 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1df60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1df70 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1df80 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1df90 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1dfa0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1dfb0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1dfc0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1dfd0 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1dfe0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1dff0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1e000 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1e010 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1e020 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1e030 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1e040 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1e050 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1e060 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1e070 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1e080 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1e090 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1e0a0 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1e0b0 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1e0c0 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1e0d0 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1e0e0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1e0f0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1e100 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1e110 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1e120 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1e130 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1e140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e150 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1e160 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1e170 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1e180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e190 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1e1a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1e1b0 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1e1c0 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1e1d0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1e1e0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1e1f0 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1e200 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1e210 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1e220 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1e230 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1e240 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1e250 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1e260 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1e270 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1e280 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e290 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1e2a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1e2b0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1e2c0 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1e2d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e2f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e300 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1e310 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1e320 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1e330 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e340 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1e350 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e360 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1e370 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1e380 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e390 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1e3a0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1e3b0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1e3c0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1e3d0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1e3e0 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1e3f0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1e400 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1e410 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1e420 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1e430 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1e440 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1e450 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1e460 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1e470 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1e480 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1e490 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1e4a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e4b0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1e4c0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1e4d0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1e4e0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1e4f0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1e500 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1e510 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1e520 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1e530 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1e570 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1e580 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1e590 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e5a0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1e5b0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1e5c0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1e5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e5e0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1e5f0 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1e600 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1e610 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1e620 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1e630 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1e640 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1e650 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1e660 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1e670 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1e680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1e690 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1e6a0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e6b0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1e6c0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1e6d0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1e6e0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1e6f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e710 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e720 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e730 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1e740 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1e750 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1e760 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1e770 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1e780 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1e790 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1e7a0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1e7b0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1e7c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1e7d0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1e7e0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1e7f0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1e800 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1e810 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1e820 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1e830 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1e840 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1e850 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1e860 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1e870 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e880 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1e890 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1e8a0 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1e8b0 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1e8c0 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1e8d0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1e8e0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1e8f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1e900 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e910 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1e920 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1e930 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1e940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e950 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1e960 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1e970 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1e980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e990 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1e9a0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1e9b0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1e9c0 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1e9d0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1e9e0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e9f0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1ea00 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1ea10 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1ea20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1ea30 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1ea40 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1ea50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ea60 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1ea70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ea80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1ea90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1eaa0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1eab0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1eac0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1ead0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1eae0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1eaf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1eb00 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1eb10 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1eb20 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1eb30 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1eb40 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1eb50 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1eb60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1eb70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1eb80 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1eb90 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1eba0 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1ebb0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1ebc0 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1ebd0 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1ebe0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1ebf0 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1ec00 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1ec10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ec20 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1ec30 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1ec40 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1ec50 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1ec60 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1ec70 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1ec80 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1ec90 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ecc0 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1ecd0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1ece0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1ed10 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1ed20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1ed30 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1ed40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ed50 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1ed60 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1ed70 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1ed80 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1ed90 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1eda0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1edb0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1edc0 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1edd0 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1ede0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1edf0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1ee00 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1ee10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ee20 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1ee30 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1ee40 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1ee50 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1ee60 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1ee70 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1ee80 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1ee90 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1eea0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1eeb0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1eec0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1eed0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1eee0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1eef0 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1ef00 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1ef10 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1ef20 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1ef30 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1ef40 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1ef50 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1ef60 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1ef70 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1ef80 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1ef90 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1efa0 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1efb0 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1efc0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1efd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1efe0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1eff0 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1f000 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1f010 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1f020 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1f030 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1f040 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1f050 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1f060 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1f070 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1f080 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1f090 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f0a0 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1f0b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1f0c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f0d0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1f0e0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1f0f0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1f100 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1f110 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1f120 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f130 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1f140 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1f150 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1f160 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1f170 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1f180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f190 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f1a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1f1b0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1f1c0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1f1d0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1f1e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f1f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f200 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1f210 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1f220 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f230 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1f240 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1f250 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1f260 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f280 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f290 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f2a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f2b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f2c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f2d0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1f2e0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1f2f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f300 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1f310 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1f320 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1f330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f340 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f350 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1f360 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1f370 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1f380 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1f390 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1f3a0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1f3b0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1f3c0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1f3d0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1f3e0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1f3f0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1f400 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1f410 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1f420 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1f430 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1f440 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1f450 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1f460 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1f470 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1f480 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1f490 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1f4a0 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1f4b0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1f4c0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1f4d0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1f4e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f4f0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1f500 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1f510 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1f520 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1f530 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1f540 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1f550 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f560 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1f570 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1f580 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1f590 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1f5a0 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1f5b0 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1f5c0 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1f5d0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1f5e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f5f0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1f600 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1f610 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1f620 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1f630 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1f640 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1f650 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1f660 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1f670 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1f680 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1f690 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1f6a0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1f6b0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1f6c0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1f6d0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1f6e0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1f6f0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1f700 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f710 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1f720 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f730 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1f740 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1f750 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1f760 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1f770 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1f780 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1f790 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1f7a0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1f7b0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1f7c0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1f7d0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1f7e0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1f7f0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1f800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1f810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f820 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f830 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1f840 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f850 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f860 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1f870 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f880 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1f890 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1f8a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f8b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f8c0 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1f8d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1f8e0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1f8f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1f900 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1f910 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1f920 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1f930 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1f940 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f950 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f960 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1f970 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1f980 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1f990 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1f9a0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1f9b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f9c0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f9d0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f9e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f9f0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1fa00 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1fa10 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1fa20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1fa30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1fa40 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1fa50 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1fa60 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1fa70 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1fa80 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1fa90 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1faa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1fac0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1fad0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1fae0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1faf0 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1fb00 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1fb10 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1fb20 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1fb30 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1fb40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1fb50 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1fb60 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1fb70 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1fb80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1fb90 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1fba0 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1fbb0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1fbc0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1fbd0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1fbe0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1fbf0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1fc00 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1fc10 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1fc20 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1fc30 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1fc40 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1fc50 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1fc60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1fc70 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1fc80 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1fc90 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1fca0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1fcb0 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1fcc0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1fcd0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1fce0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1fcf0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1fd00 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1fd10 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1fd20 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1fd30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1fd40 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1fd50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fd60 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1fd70 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1fd80 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1fd90 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1fda0 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1fdb0 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1fdc0 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1fdd0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1fde0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1fdf0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1fe00 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1fe10 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1fe20 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1fe30 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1fe40 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1fe50 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1fe60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1fe70 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1fe80 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1fe90 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1fea0 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1feb0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1fec0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1fed0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1fee0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1fef0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1ff00 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1ff10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1ff20 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1ff30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ff40 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1ff50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1ff60 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1ff70 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1ff80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1ff90 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1ffa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1ffb0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1ffc0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1ffd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1ffe0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1fff0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
20000 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
20010 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
20020 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
20030 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
20040 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
20050 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
20060 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
20070 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
20080 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
20090 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
200a0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
200b0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
200c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
200d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
200e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
200f0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
20100 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
20110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20120 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
20130 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20140 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
20150 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20160 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
20170 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
20180 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20190 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
201a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
201b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
201c0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
201d0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
201e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
201f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
20200 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20210 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
20220 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
20230 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
20240 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
20250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20260 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
20270 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
20280 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
20290 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
202a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
202b0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
202c0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
202d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
202e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
202f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20300 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20310 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20320 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
20330 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20340 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
20350 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
20360 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
20370 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
20380 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
20390 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
203a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
203b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
203c0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
203d0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
203e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
203f0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
20400 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
20410 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20420 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
20430 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
20440 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
20450 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
20460 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
20470 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
20480 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
20490 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
204a0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
204b0 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
204c0 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
204d0 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
204e0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
204f0 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
20500 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
20510 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
20520 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
20530 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
20540 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
20550 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
20560 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
20570 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
20580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
20590 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
205a0 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
205b0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
205c0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
205d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
205e0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
205f0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
20600 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20610 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
20620 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
20630 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
20640 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
20650 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
20660 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
20670 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
20680 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
20690 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
206a0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
206b0 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
206c0 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
206d0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
206e0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
206f0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
20700 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
20710 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
20720 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
20730 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
20740 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
20750 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
20760 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
20770 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
20780 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
20790 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
207a0 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
207b0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
207c0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
207d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
207e0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
207f0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
20800 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
20810 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
20820 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
20830 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
20840 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
20850 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
20860 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
20870 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20880 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
20890 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
208a0 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
208b0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
208c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
208d0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
208e0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
208f0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
20900 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
20910 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
20920 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
20930 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
20940 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
20950 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
20960 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
20970 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
20980 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
20990 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
209a0 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
209b0 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
209c0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
209d0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
209e0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
209f0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
20a00 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
20a10 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
20a20 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
20a30 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20a40 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
20a50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20a60 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
20a70 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
20a80 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
20a90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20aa0 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
20ab0 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
20ac0 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
20ad0 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
20ae0 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
20af0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
20b00 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
20b10 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
20b20 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
20b30 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
20b40 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
20b50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20b60 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
20b70 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
20b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20b90 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
20ba0 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
20bb0 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
20bc0 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
20bd0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
20be0 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
20bf0 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
20c00 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20c10 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
20c20 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
20c30 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
20c40 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
20c50 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
20c60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
20c70 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
20c80 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
20c90 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
20ca0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
20cb0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
20cc0 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
20cd0 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
20ce0 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
20cf0 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
20d00 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
20d10 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
20d20 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
20d30 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
20d40 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
20d50 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
20d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20d70 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
20d80 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
20d90 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
20da0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
20db0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
20dc0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20dd0 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
20de0 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
20df0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
20e00 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
20e10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20e20 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
20e30 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
20e40 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20e50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
20e60 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
20e70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
20e80 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
20e90 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
20ea0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
20eb0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
20ec0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
20ed0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
20ee0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
20ef0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
20f00 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
20f10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20f20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
20f30 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
20f40 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
20f50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20f60 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
20f70 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
20f80 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20f90 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
20fa0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
20fc0 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
20fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
20fe0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
20ff0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21000 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
21010 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
21020 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
21030 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
21040 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
21050 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21060 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21070 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
21080 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
21090 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
210a0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
210b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
210c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
210d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
210e0 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
210f0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
21100 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21110 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
21120 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
21130 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21140 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
21150 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
21160 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
21170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
21190 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
211a0 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
211b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
211c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
211d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
211e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
211f0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
21200 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
21210 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
21220 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
21230 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
21240 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
21250 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
21260 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
21270 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
21280 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
21290 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
212a0 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
212b0 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
212c0 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
212d0 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
212e0 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
212f0 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
21300 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
21310 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
21320 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
21330 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21340 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
21350 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
21360 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
21370 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
21380 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
21390 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
213a0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
213b0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
213c0 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
213d0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
213e0 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
213f0 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
21400 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
21410 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
21420 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
21430 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
21440 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
21450 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
21460 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
21470 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
21480 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
21490 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
214a0 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
214b0 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
214c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
214d0 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
214e0 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
214f0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
21500 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
21510 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
21520 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
21530 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
21540 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
21550 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
21560 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
21570 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
21580 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
21590 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
215a0 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
215b0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
215c0 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
215d0 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
215e0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
215f0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
21600 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
21610 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
21620 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
21630 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
21640 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
21650 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
21660 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
21670 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21680 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
21690 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
216a0 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
216b0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
216c0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
216d0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
216e0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
216f0 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
21700 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
21710 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
21720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21730 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
21740 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
21750 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
21760 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
21770 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
21780 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21790 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
217a0 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
217b0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
217c0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
217d0 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79     if( writeOnly
217e0 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73   && (p->curFlags
217f0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
21800 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
21810 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
21820 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
21830 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
21840 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
21850 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
21860 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
21870 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
21880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ){.            (
218a0 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65  void)sqlite3Btre
218b0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
218c0 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a  pBtree, rc, 0);.
218d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
218e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
218f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21910 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
21920 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20  ursor(p);.      
21930 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
21940 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
21950 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
21960 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  = errCode;.     
21970 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65   }.      btreeRe
21980 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
21990 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ges(p);.    }.  
219a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
219b0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
219c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
219d0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
219e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
219f0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
21a00 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
21a10 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
21a20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
21a30 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
21a40 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
21a50 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
21a60 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
21a70 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
21a80 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
21a90 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
21aa0 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
21ab0 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
21ac0 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
21ad0 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
21ae0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
21af0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
21b00 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
21b10 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
21b20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21b30 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
21b40 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
21b50 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
21b60 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
21b70 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
21b80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
21b90 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
21ba0 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
21bb0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
21bc0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21bd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21be0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
21bf0 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
21c00 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
21c10 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
21c20 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
21c30 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
21c40 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
21c50 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
21c60 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
21c70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
21c80 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
21c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21ca0 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
21cb0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
21cc0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
21cd0 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
21ce0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21cf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
21d10 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
21d20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
21d30 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
21d40 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
21d50 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
21d60 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
21d70 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
21d80 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
21d90 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
21da0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
21db0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
21dc0 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
21dd0 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
21de0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
21df0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
21e00 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
21e10 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
21e20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21e30 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
21e40 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
21e50 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
21e60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
21e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e80 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
21e90 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
21ea0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
21eb0 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
21ec0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
21ed0 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
21ee0 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
21ef0 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
21f00 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
21f10 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
21f20 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
21f30 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
21f40 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
21f50 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
21f60 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
21f70 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
21f80 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
21f90 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
21fa0 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
21fb0 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
21fc0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
21fd0 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
21fe0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
21ff0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
22000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22010 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
22020 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
22030 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
22040 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
22050 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
22060 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
22070 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
22080 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
22090 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
220a0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
220b0 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
220c0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
220d0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
220e0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
220f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22100 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
22110 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
22120 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
22130 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
22140 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
22150 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
22160 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
22170 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
22180 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
22190 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
221a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
221b0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
221c0 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
221d0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
221e0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
221f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
22200 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
22210 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
22220 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
22230 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
22240 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
22250 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
22260 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
22270 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
22280 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
22290 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
222a0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
222b0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
222c0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
222d0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
222e0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
222f0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
22300 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
22310 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
22320 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
22330 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
22340 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
22350 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
22360 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
22370 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
22380 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
22390 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
223a0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
223b0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
223c0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
223d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
223e0 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
223f0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
22400 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
22410 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
22420 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
22430 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
22440 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
22450 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
22460 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
22470 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
22480 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
22490 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
224a0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
224b0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
224c0 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
224d0 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
224e0 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
224f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
22500 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
22510 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
22520 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
22530 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
22540 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22550 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
22560 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
22570 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
22580 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22590 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
225a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
225b0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
225c0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
225d0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
225e0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
225f0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
22600 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
22610 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22620 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
22630 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
22640 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
22650 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22660 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
22670 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
22680 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
22690 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
226a0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
226b0 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
226c0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
226d0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
226e0 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
226f0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
22700 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
22710 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
22720 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22730 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
22740 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
22750 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22760 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
22770 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
22780 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  ement);.  sqlite
22790 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
227a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
227b0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
227c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
227d0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
227e0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
227f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
22800 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
22810 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
22820 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
22830 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
22840 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
22850 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
22860 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
22870 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
22880 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
22890 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
228a0 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
228b0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
228c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
228d0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
228e0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
228f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
22900 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
22910 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
22920 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
22930 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
22940 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
22950 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
22960 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
22970 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
22980 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
22990 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
229a0 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
229b0 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
229c0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
229d0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
229e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
229f0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
22a00 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
22a10 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
22a20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22a30 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
22a40 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
22a50 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
22a60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22a70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
22a80 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
22a90 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
22aa0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22ab0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
22ac0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
22ad0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
22ae0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
22af0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
22b00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22b10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69  eEnter(p);.    i
22b20 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
22b30 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
22b40 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
22b50 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
22b60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22b70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22b80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22b90 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
22ba0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
22bb0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
22bc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22be0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
22bf0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
22c00 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
22c10 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
22c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
22c30 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
22c40 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
22c50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
22c60 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
22c70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
22c80 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
22c90 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
22ca0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22cb0 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
22cc0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
22cd0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
22ce0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
22cf0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22d00 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
22d10 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
22d20 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
22d30 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
22d40 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
22d50 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
22d60 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
22d70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22d80 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
22d90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22da0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
22db0 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
22dc0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
22dd0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
22de0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
22df0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
22e00 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
22e10 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
22e20 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
22e30 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
22e40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
22e50 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
22e60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22e70 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
22e80 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
22e90 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
22ea0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
22eb0 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
22ec0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
22ed0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
22ee0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
22ef0 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61  CSR bit of wrFla
22f00 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  g is clear, then
22f10 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
22f20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  only.** be used 
22f30 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66  for reading.  If
22f40 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
22f50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
22f60 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
22f70 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
22f80 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77  reading or for w
22f90 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
22fa0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
22fb0 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c  riting.** are al
22fc0 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61  so met.  These a
22fd0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
22fe0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
22ff0 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  et in order.** f
23000 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65  or writing to be
23010 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
23020 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
23030 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
23040 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
23050 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45   containing BTRE
23060 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a  E_WRCSR.**.** 2:
23070 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
23080 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
23090 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
230a0 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
230b0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
230c0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
230d0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
230e0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
230f0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
23100 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
23110 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
23120 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
23130 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
23140 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
23150 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
23160 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
23170 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
23180 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
23190 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
231a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
231b0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
231c0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
231d0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
231e0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
231f0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
23200 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
23210 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23220 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52  ** The BTREE_FOR
23230 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72  DELETE bit of wr
23240 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61  Flag may optiona
23250 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54  lly be set if BT
23260 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20  REE_WRCSR.** is 
23270 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45  set.  If FORDELE
23280 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  TE is set, that 
23290 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
232a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
232b0 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72  that.** this cur
232c0 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
232d0 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f   used to seek to
232e0 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72   and delete entr
232f0 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ies of an index.
23300 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ** as part of a 
23310 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74  larger DELETE st
23320 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  atement.  The FO
23330 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20  RDELETE hint is 
23340 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  not used by.** t
23350 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
23360 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79  on.  But in a hy
23370 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72  pothetical alter
23380 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
23390 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69  ngine .** in whi
233a0 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ch index entries
233b0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
233c0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
233d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
233e0 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20  ble.** rows are 
233f0 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52  deleted, the FOR
23400 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61  DELETE flag is a
23410 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53   hint that all S
23420 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a  EEK and DELETE.*
23430 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  * operations on 
23440 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20  this cursor can 
23450 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c  be no-ops and al
23460 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e  l READ operation
23470 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e  s can .** return
23480 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62   a null row (2-b
23490 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29  ytes: 0x01 0x00)
234a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
234b0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
234c0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
234d0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
234e0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
234f0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
23500 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
23510 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23520 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
23530 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
23540 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
23550 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
23560 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
23570 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
23580 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
23590 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
235a0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
235b0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
235c0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
235d0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
235e0 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
235f0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23620 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
23630 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
23660 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
23670 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
23680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
236a0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
236b0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
236c0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
236d0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
236e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
236f0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
23700 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
23710 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
23740 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
23750 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
23760 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
23770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
23780 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
23790 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
237a0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237c0 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
237d0 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
237e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
237f0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
23800 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
23810 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
23820 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
23830 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a  g==BTREE_WRCSR .
23840 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23850 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42  ==(BTREE_WRCSR|B
23860 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20  TREE_FORDELETE) 
23870 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
23880 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
23890 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
238a0 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
238b0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
238c0 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
238d0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
238e0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
238f0 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
23900 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
23910 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
23920 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
23930 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
23940 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
23950 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
23960 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
23970 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
23980 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
23990 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
239a0 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29  0, (wrFlag?2:1))
239b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
239c0 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
239d0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
239e0 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
239f0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
23a00 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
23a10 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
23a20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
23a30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
23a40 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
23a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23a60 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
23a70 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23a80 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
23a90 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
23aa0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
23ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
23ac0 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
23ad0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
23ae0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
23af0 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
23b00 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
23b10 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
23b20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
23b30 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
23b40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
23b50 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  PT;.  }.  if( iT
23b60 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
23b70 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
23b80 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23b90 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
23ba0 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
23bb0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
23bc0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
23bd0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
23be0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
23bf0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
23c00 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
23c10 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
23c20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
23c30 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
23c40 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
23c50 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
23c60 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
23c70 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
23c80 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
23c90 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
23ca0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
23cb0 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
23cc0 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
23cd0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
23ce0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
23cf0 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
23d00 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
23d10 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
23d20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
23d30 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
23d40 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
23d50 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
23d60 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
23d70 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
23d80 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
23d90 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
23da0 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
23db0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
23dc0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
23dd0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
23de0 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
23df0 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
23e00 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
23e10 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
23e20 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
23e30 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
23e40 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
23e50 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
23e60 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
23e70 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
23e80 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
23e90 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
23ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
23eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23ec0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
23f00 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f30 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
23f40 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
23f50 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
23f90 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
23fa0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
23fb0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23fd0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
23fe0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
23ff0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
24020 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
24030 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
24040 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
24050 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
24060 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
24080 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24090 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
240a0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
240b0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
240c0 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
240d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
240e0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
240f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24100 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
24110 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
24120 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
24130 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
24140 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
24150 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
24160 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
24170 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
24180 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
24190 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
241a0 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
241b0 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
241c0 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
241d0 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
241e0 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
241f0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
24200 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
24210 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
24220 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24230 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
24240 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
24250 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
24260 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
24270 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
24280 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
24290 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
242a0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
242b0 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
242c0 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
242d0 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
242e0 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
242f0 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
24300 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
24310 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
24320 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
24330 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
24340 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
24350 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
24360 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
24370 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
24380 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
24390 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
243a0 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
243b0 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
243c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
243d0 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
243e0 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
243f0 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
24400 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
24410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
24420 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
24430 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
24440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
24450 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
24460 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
24470 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
24480 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24490 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
244a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
244b0 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
244c0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
244d0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
244e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
244f0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
24500 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24510 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
24520 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
24530 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
24540 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
24550 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
24560 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
24570 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
24580 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
24590 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
245a0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
245b0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
245c0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
245d0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
245e0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
245f0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
24600 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24620 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
24630 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
24640 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
24650 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ) );.    }.    b
24660 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
24670 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b  rsorPages(pCur);
24680 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
24690 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
246a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
246b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
246c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
246d0 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
246e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
246f0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
24700 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
24710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24720 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
24730 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
24740 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
24750 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
24760 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
24770 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
24780 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
24790 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
247a0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
247b0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
247c0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
247d0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
247e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
247f0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
24800 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
24810 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
24820 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
24830 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
24840 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
24850 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
24860 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
24870 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
24880 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
24890 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
248a0 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
248b0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
248c0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
248d0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
248e0 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a  ur->ix, &info);.
248f0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
24900 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
24910 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
24920 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
24930 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
24940 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
24950 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
24960 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
24970 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
24980 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
24990 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
249a0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
249b0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
249c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
249d0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
249e0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
249f0 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
24a00 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d  ,pCur->ix,&pCur-
24a10 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
24a20 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
24a30 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
24a40 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
24a50 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
24a60 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
24a70 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
24a80 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
24a90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
24aa0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
24ab0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
24ac0 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
24ad0 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
24ae0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
24af0 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
24b00 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
24b10 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
24b20 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
24b30 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
24b40 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
24b50 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
24b60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24b70 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
24b80 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
24b90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
24ba0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
24bb0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
24bc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
24bd0 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
24be0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
24bf0 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
24c00 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
24c10 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
24c20 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
24c30 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
24c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24c50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
24c60 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
24c70 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
24c80 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
24c90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
24ca0 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
24cb0 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
24cc0 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
24cd0 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
24ce0 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
24cf0 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
24d00 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
24d10 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
24d20 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
24d30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24d40 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
24d50 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
24d60 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
24d70 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24d80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24d90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24da0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24db0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24dc0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
24dd0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
24de0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
24df0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
24e00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
24e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24e20 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
24e30 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
24e40 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
24e50 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
24e60 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24e70 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
24e80 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
24e90 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
24ea0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
24eb0 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
24ec0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
24ed0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
24ee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24ef0 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
24f00 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
24f10 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
24f20 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
24f30 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
24f40 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
24f50 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
24f60 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
24f70 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
24f80 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
24f90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24fa0 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
24fb0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
24fc0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
24fd0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24fe0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24ff0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25000 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25010 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25020 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
25030 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
25040 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
25050 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  oad;.}../*.** Gi
25060 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
25070 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
25080 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
25090 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
250a0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
250b0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
250c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
250d0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
250e0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
250f0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
25100 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
25110 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
25120 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
25130 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
25140 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
25150 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
25160 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
25170 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
25180 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
25190 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
251a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
251b0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
251c0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
251d0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
251e0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
251f0 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
25200 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
25210 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
25220 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
25230 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
25240 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
25250 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
25260 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
25270 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
25280 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
25290 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
252a0 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
252b0 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
252c0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
252d0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
252e0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
252f0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
25300 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
25310 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
25320 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
25330 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
25340 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
25350 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
25360 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
25370 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
25380 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
25390 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
253a0 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
253b0 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
253c0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
253d0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
253e0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
253f0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
25400 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
25410 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
25420 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
25430 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
25440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
25450 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
25460 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25480 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
25490 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
254a0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
254b0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
254c0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
254d0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
254e0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
254f0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
25500 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
25510 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
25520 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
25530 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
25540 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
25550 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
25560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
25570 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25580 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
25590 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
255a0 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
255b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
255c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
255d0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
255e0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
255f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
25600 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
25610 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
25620 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
25630 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
25640 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
25650 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
25660 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
25670 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
25680 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
25690 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
256a0 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
256b0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
256c0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
256d0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
256e0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
256f0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
25700 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
25710 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
25720 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
25730 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
25740 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
25750 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
25760 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
25770 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
25780 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
25790 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
257a0 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
257b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
257c0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
257d0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
257e0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
257f0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
25800 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
25810 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25820 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
25830 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
25840 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
25850 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
25860 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
25870 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25880 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
25890 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
258a0 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
258b0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
258c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
258d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
258e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
258f0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
25900 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
25910 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
25920 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
25930 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
25940 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
25950 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
25960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25970 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
25980 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
25990 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
259a0 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
259b0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
259c0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
259d0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
259e0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
259f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
25a00 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
25a10 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
25a20 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
25a30 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
25a40 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
25a50 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
25a60 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
25a70 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
25a80 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
25a90 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
25aa0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
25ab0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
25ac0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
25ad0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
25ae0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
25af0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
25b00 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
25b10 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
25b20 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
25b30 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
25b40 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
25b50 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
25b60 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
25b70 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
25b80 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
25b90 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
25ba0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
25bb0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
25bc0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25bd0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
25be0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
25bf0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
25c00 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
25c10 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
25c20 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
25c30 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
25c40 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
25c50 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
25c60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
25c70 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
25c80 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
25c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25ca0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
25cb0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
25cc0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
25cd0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
25ce0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
25cf0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
25d00 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
25d10 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
25d20 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
25d30 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
25d40 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
25d50 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
25d60 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
25d70 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
25d80 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
25d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25da0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
25db0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25de0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
25df0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
25e00 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
25e10 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
25e20 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
25e30 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
25e40 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
25e50 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
25e60 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
25e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25e80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
25e90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
25ea0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
25eb0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
25ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
25ed0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
25ee0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
25ef0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
25f00 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
25f10 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
25f20 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
25f30 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
25f40 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
25f50 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
25f60 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
25f70 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
25f80 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
25f90 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
25fa0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
25fb0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
25fc0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
25fd0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
25fe0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
25ff0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
26000 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
26010 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
26020 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
26030 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
26040 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
26050 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
26060 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
26070 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
26080 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
26090 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
260a0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
260b0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
260c0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
260d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
260e0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
260f0 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
26100 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
26110 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74  ly populate.** t
26120 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26130 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
26140 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
26150 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
26160 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
26170 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
26180 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
26190 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
261a0 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
261b0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
261c0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
261d0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
261e0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
261f0 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20  , it must be.** 
26200 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
26210 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
26220 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
26230 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
26240 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
26250 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
26260 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
26270 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
26280 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
26290 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
262a0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
262b0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
262c0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
262d0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
262e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
262f0 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
26300 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
26310 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
26320 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
26330 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
26340 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
26350 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
26360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
26370 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
26380 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
26390 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
263a0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
263b0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
263c0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
263d0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
263e0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
263f0 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
26400 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
26410 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
26420 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
26430 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
26440 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
26450 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
26460 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
26470 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
26480 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
26490 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
264a0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
264b0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
264c0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
264d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
264e0 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
264f0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
26500 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
26510 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26520 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
26530 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
26540 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
26550 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26570 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
26580 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
26590 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
265a0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
265b0 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
265c0 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
265d0 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
265e0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
265f0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75   original out bu
26600 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ffer */.#endif..
26610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
26620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  );.  assert( eOp
26630 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b  ==0 || eOp==1 );
26640 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26650 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26660 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
26670 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
26680 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
26690 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
266a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
266b0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
266c0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
266d0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
266e0 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74  ayload;.  assert
266f0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
26700 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
26710 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  oad );..  assert
26720 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61  ( aPayload > pPa
26730 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69  ge->aData );.  i
26740 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f  f( (uptr)(aPaylo
26750 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74  ad - pPage->aDat
26760 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c  a) > (pBt->usabl
26770 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e  eSize - pCur->in
26780 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  fo.nLocal) ){.  
26790 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
267a0 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
267b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
267c0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
267d0 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63  r.  The.    ** c
267e0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
267f0 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20   is really:.    
26800 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b  **    &aPayload[
26810 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
26820 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
26830 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
26840 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69  ze].    ** but i
26850 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74  s recast into it
26860 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74  s current form t
26870 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20  o avoid integer 
26880 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d  overflow problem
26890 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  s.    */.    ret
268a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
268b0 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
268c0 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  gno);.  }..  /* 
268d0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
268e0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
268f0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
26900 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
26910 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
26920 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
26930 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
26940 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
26950 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
26960 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
26970 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
26980 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
26990 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
269a0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
269b0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
269c0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
269d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
269e0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
269f0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
26a00 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
26a10 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
26a20 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
26a30 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
26a40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26a50 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
26a60 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
26a70 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
26a80 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
26a90 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
26aa0 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
26ab0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
26ac0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
26ad0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
26ae0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
26af0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
26b00 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
26b10 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
26b20 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
26b30 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
26b40 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  t now..    **.  
26b50 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
26b60 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
26b70 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
26b80 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
26b90 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
26ba0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
26bb0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
26bc0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
26bd0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
26be0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
26bf0 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
26c00 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
26c10 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
26c20 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
26c30 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
26c40 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
26c50 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
26c60 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
26c70 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  */.    if( (pCur
26c80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26c90 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
26ca0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
26cb0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
26cc0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
26cd0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
26ce0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
26cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
26d00 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
26d10 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
26d20 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
26d30 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
26d40 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
26d50 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
26d60 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
26d70 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
26d80 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
26d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26db0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
26dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26dd0 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
26de0 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
26df0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
26e00 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
26e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26e20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
26e30 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
26e40 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66   0, nOvfl*sizeof
26e50 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70  (Pgno));.      p
26e60 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
26e70 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
26e80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26e90 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
26ea0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26eb0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
26ec0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
26ed0 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66        ** entry f
26ee0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
26ef0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
26f00 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
26f10 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  ip.      ** dire
26f20 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
26f30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
26f40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
26f50 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
26f60 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20  ){.        iIdx 
26f70 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
26f80 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  ze);.        nex
26f90 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
26fa0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
26fb0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
26fc0 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
26fd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26fe0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
26ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
27000 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c  mt>0 );.    whil
27010 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20  e( nextPage ){. 
27020 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
27030 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
27040 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27050 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
27060 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
27070 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27080 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  x]==0.          
27090 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76      || pCur->aOv
270a0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
270b0 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  xtPage.         
270c0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
270d0 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  DB );.      pCur
270e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
270f0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  ] = nextPage;.. 
27100 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
27110 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
27120 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
27130 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
27140 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
27150 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
27160 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
27170 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
27180 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
27190 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
271a0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
271b0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
271c0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
271d0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
271e0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
271f0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
27200 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
27210 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
27220 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
27230 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
27240 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
27250 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
27260 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c  ert( pCur->curFl
27270 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27280 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Ovfl );.        
27290 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42  assert( pCur->pB
272a0 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64  tree->db==pBt->d
272b0 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b );.        if(
272c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
272d0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
272e0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
272f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27300 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
27310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27320 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
27330 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
27340 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
27350 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
27360 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
27370 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
27380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27390 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
273a0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
273b0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
273c0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
273d0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
273e0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
273f0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
27400 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
27410 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
27420 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
27430 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
27440 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
27450 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
27460 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d      /* File from
27470 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69 72   which to do dir
27480 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65 61  ect overflow rea
27490 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  d */.#endif.    
274a0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
274b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
274c0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
274d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
274e0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
274f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
27500 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27510 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
27520 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
27530 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
27540 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
27550 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27560 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
27570 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
27580 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
27590 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
275a0 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
275b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
275c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
275d0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
275e0 20 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   3) there is no 
275f0 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
27600 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
27610 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
27620 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
27630 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
27640 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
27650 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
27660 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
27670 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
27680 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
27690 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
276a0 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
276b0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
276c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
276d0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
276e0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
276f0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
27700 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
27710 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
27720 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
27730 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
27740 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
27750 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
27760 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
27770 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
27780 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
27790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
277a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
277b0 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
277f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
27800 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
27840 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
27850 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
27860 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
27870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
27880 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
27890 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
278a0 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
278b0 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
278c0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
278d0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
278e0 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61 6c  lite3PagerUseWal
278f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
27900 78 74 50 61 67 65 29 20 20 20 20 20 20 20 2f 2a  xtPage)       /*
27910 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
27920 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70   && &pBuf[-4]>=p
27930 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20  BufStart        
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f         /* (6) */
27960 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
27970 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
27980 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
27990 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
279a0 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -4];.          a
279b0 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70  ssert( aWrite>=p
279c0 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20  BufStart );     
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279e0 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36      /* due to (6
279f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
27a00 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
27a10 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
27a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27a30 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
27a40 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
27a50 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
27a60 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
27a70 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
27a80 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
27a90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
27aa0 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
27ab0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
27ac0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
27ad0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
27ae0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
27af0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
27b00 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
27b10 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
27b20 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f               (eO
27b40 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  p==0 ? PAGER_GET
27b50 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
27b60 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
27b70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27b80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27b90 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
27ba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
27bb0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
27bd0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
27be0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
27bf0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
27c00 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
27c10 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
27c20 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
27c30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
27c50 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
27c60 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
27c70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
27c80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27c90 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
27ca0 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20       if( amt==0 
27cb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27cc0 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
27cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27ce0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
27cf0 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20      iIdx++;.    
27d00 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
27d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
27d20 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76  t>0 ){.    /* Ov
27d30 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64  erflow chain end
27d40 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f  s prematurely */
27d50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27d60 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
27d70 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
27d80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27d90 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
27da0 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
27db0 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
27dc0 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
27dd0 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
27de0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
27df0 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
27e00 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
27e10 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
27e20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
27e30 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
27e40 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
27e50 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
27e60 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
27e70 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
27e80 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
27e90 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
27ea0 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
27eb0 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
27ec0 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
27ed0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
27ee0 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
27ef0 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
27f00 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
27f10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
27f20 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
27f30 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
27f40 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
27f50 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
27f60 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
27f70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
27f80 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
27f90 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
27fa0 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
27fb0 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
27fc0 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
27fd0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
27fe0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
27ff0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
28000 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
28010 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
28020 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
28030 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
28040 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
28050 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
28060 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
28070 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
28080 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
28090 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
280a0 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
280b0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
280c0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
280d0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
280e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
280f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28100 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28110 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28120 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28130 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28140 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  && pCur->pPage )
28150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28160 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
28170 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
28180 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
28190 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
281a0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
281b0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
281c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
281d0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
281e0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
281f0 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
28200 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
28210 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
28220 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
28230 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
28240 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
28250 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
28260 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
28270 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
28280 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
28290 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
282a0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
282b0 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
282c0 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
282d0 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
282e0 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
282f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
28300 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
28310 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28330 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
28340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28350 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28360 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
28370 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28380 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
28390 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
283a0 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
283b0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
283c0 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
283d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
283e0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
283f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28400 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28410 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28420 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28430 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28440 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
28450 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28460 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
28470 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28480 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28490 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
284a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
284b0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
284c0 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
284d0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
284e0 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
284f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28500 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
28510 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
28520 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
28530 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
28540 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
28550 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
28560 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
28570 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
28580 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
28590 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
285a0 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
285b0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
285c0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
285d0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
285e0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
285f0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
28600 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28610 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
28620 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
28630 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
28640 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
28650 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
28660 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
28670 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
28680 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
28690 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
286a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
286b0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
286c0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
286d0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
286e0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
286f0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
28700 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
28710 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
28720 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
28730 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
28740 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
28750 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
28760 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
28770 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
28780 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
28790 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
287a0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
287b0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
287c0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
287d0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
287e0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
287f0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
28800 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
28810 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
28820 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
28830 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
28840 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
28850 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
28860 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
28870 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28880 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
28890 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
288a0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
288b0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
288c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
288d0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
288e0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
288f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
28900 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
28910 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
28920 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
28930 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
28940 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
28950 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
28960 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
28970 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
28980 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
28990 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
289a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
289b0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
289c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
289d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
289e0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
289f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28a00 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
28a10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
28a20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28a30 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
28a40 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28a50 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
28a60 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28a70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28a80 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
28a90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28aa0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
28ab0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20  r->pPage->aData 
28ac0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
28ad0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28ae0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
28af0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
28b00 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
28b10 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
28b20 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  )(pCur->pPage->a
28b30 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
28b40 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a  info.pPayload);.
28b50 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
28b60 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d  .nLocal<amt ) am
28b70 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
28b80 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d  Local;.  *pAmt =
28b90 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28   amt;.  return (
28ba0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
28bb0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
28bc0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
28bd0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
28be0 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
28bf0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
28c00 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
28c10 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
28c20 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
28c30 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
28c40 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
28c50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
28c60 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
28c70 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
28c80 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
28c90 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
28ca0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
28cb0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
28cc0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
28cd0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
28ce0 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
28cf0 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
28d00 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
28d10 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
28d20 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
28d30 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
28d40 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
28d50 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
28d60 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
28d70 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
28d80 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
28d90 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
28da0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
28db0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
28dc0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
28dd0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
28de0 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
28df0 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
28e00 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
28e10 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28e20 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
28e30 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
28e40 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
28e50 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
28e60 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
28e70 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28e80 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
28e90 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
28ea0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
28eb0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
28ec0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
28ed0 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
28ee0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
28ef0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
28f00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
28f10 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
28f20 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
28f30 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
28f40 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
28f50 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
28f60 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
28f70 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
28f80 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
28f90 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
28fa0 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
28fb0 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
28fc0 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
28fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28fe0 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
28ff0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
29000 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
29010 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
29020 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
29030 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29040 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29050 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29060 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29070 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29080 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
29090 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
290a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
290b0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
290c0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
290d0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
290e0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
290f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29100 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
29110 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29120 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
29130 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
29140 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
29150 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
29160 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29170 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69  iPage] = pCur->i
29180 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  x;.  pCur->apPag
29190 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  e[pCur->iPage] =
291a0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
291b0 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
291c0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20  pCur->iPage++;. 
291d0 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
291e0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
291f0 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  gno, &pCur->pPag
29200 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63  e, pCur, pCur->c
29210 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
29220 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29230 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
29240 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
29250 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
29260 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
29270 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
29280 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
29290 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
292a0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
292b0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
292c0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
292d0 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
292e0 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
292f0 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
29300 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
29310 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
29320 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
29330 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
29340 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
29350 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
29360 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
29370 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
29380 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
29390 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
293a0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
293b0 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
293c0 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
293d0 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
293e0 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29400 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
29410 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
29420 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
29430 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
29440 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
29450 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
29460 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
29470 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
29480 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
29490 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
294a0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
294b0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
294c0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
294d0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
294e0 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
294f0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
29500 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
29510 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
29520 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
29530 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
29540 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
29550 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
29560 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
29570 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
29580 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
29590 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
295a0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
295b0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
295c0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
295d0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
295e0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
295f0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
29600 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
29610 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
29620 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
29630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
29640 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
29650 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
29660 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20  emPage *pLeaf;. 
29670 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29680 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29690 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
296a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
296b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
296c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
296d0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
296e0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  ( pCur->pPage );
296f0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
29700 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
29710 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29720 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
29730 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29740 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
29750 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  r->pPage->pgno. 
29760 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
29770 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29780 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
29790 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
297a0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
297b0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
297c0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
297d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
297e0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
297f0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
29800 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43  .  pCur->ix = pC
29810 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29820 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61  iPage-1];.  pLea
29830 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  f = pCur->pPage;
29840 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
29850 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d   pCur->apPage[--
29860 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
29870 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
29880 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a  ll(pLeaf);.}../*
29890 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
298a0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
298b0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
298c0 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
298d0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
298e0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
298f0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
29900 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
29910 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
29920 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
29930 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
29940 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
29950 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
29960 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
29970 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
29980 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
29990 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
299a0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
299b0 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
299c0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
299d0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
299e0 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
299f0 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
29a00 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
29a10 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
29a20 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
29a30 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
29a40 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
29a50 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74 68  R_INVALID and th
29a60 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29a70 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e  ns SQLITE_EMPTY.
29a80 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
29a90 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
29aa0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
29ab0 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61   first cell loca
29ac0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a  ted on the root.
29ad0 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ** (or virtual r
29ae0 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
29af0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
29b00 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
29b10 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
29b20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29b30 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
29b40 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
29b50 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
29b60 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
29b70 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
29b80 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
29b90 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
29ba0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
29bb0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
29bc0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
29bd0 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
29be0 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
29bf0 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
29c00 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
29c10 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
29c20 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
29c30 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
29c40 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
29c50 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
29c60 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
29c70 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
29c80 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
29c90 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
29ca0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
29cb0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
29cc0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
29cd0 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
29ce0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
29cf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29d00 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
29d10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29d20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29d30 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29d40 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29d50 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
29d60 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
29d70 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
29d80 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
29d90 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
29da0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
29db0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
29dc0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
29dd0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
29de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29df0 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53 4f  ->eState < CURSO
29e00 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c 7c  R_REQUIRESEEK ||
29e10 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29   pCur->iPage<0 )
29e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29e30 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20  ->pgnoRoot>0 || 
29e40 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b  pCur->iPage<0 );
29e50 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
29e60 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  age>=0 ){.    if
29e70 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b  ( pCur->iPage ){
29e80 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
29e90 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
29ea0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77 68  pPage);.      wh
29eb0 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61  ile( --pCur->iPa
29ec0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ge ){.        re
29ed0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
29ee0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
29ef0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20  ur->iPage]);.   
29f00 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
29f10 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
29f20 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20  pPage[0];.      
29f30 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
29f40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29f50 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29f60 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29f70 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29f80 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
29fa0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
29fb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
29fc0 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
29fd0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29fe0 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
29ff0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20 69  ESEEK ){.      i
2a000 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2a010 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2a020 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a030 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
2a040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2a050 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
2a060 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
2a070 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2a080 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
2a090 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  or(pCur);.    }.
2a0a0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
2a0b0 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
2a0c0 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
2a0d0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
2a0e0 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20  ->pPage,.       
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
2a110 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
2a120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a130 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
2a140 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2a150 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
2a160 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2a170 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
2a180 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
2a190 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
2a1a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20  pPage->intKey;. 
2a1b0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
2a1c0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2a1d0 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
2a1e0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
2a1f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
2a200 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
2a210 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
2a220 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
2a230 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
2a240 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
2a250 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
2a260 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
2a270 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
2a280 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
2a290 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
2a2a0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
2a2b0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
2a2c0 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
2a2d0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
2a2e0 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
2a2f0 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
2a300 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
2a310 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
2a320 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
2a330 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
2a340 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
2a350 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
2a360 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
2a370 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
2a380 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
2a390 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
2a3a0 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
2a3b0 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
2a3c0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2a3d0 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
2a3e0 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
2a3f0 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
2a400 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
2a410 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
2a420 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
2a430 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
2a440 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
2a450 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
2a460 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
2a470 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
2a480 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
2a490 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
2a4a0 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
2a4b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a4c0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 43 75 72  ORRUPT_PGNO(pCur
2a4d0 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  ->pPage->pgno);.
2a4e0 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20    }..skip_init: 
2a4f0 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30   .  pCur->ix = 0
2a500 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2a510 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2a520 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2a530 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2a540 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2a550 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70  ValidOvfl);..  p
2a560 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2a570 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  ge;.  if( pRoot-
2a580 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2a590 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2a5a0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2a5b0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2a5c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2a5d0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2a5e0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2a5f0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2a600 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a610 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2a620 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2a630 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2a640 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2a650 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a660 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2a670 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2a680 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2a690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2a6a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2a6b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2a6c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
2a6d0 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TY;.  }.  return
2a6e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2a6f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2a700 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2a710 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2a720 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2a730 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2a740 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2a750 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2a760 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2a770 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2a780 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2a790 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2a7a0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2a7b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2a7c0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2a7d0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a7e0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2a7f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a800 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2a810 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2a820 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a830 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a840 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a850 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a860 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
2a870 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a880 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2a890 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2a8a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a8b0 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
2a8c0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2a8d0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2a8e0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2a8f0 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
2a900 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2a910 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2a920 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a930 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2a940 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2a950 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2a960 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2a970 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2a980 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2a990 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2a9a0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2a9b0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2a9c0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2a9d0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a9e0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2a9f0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2aa00 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2aa10 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2aa20 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2aa30 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2aa40 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2aa50 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2aa60 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2aa70 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2aa80 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2aa90 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2aaa0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2aab0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2aac0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2aad0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2aae0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2aaf0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2ab00 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2ab10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ab20 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2ab30 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2ab40 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ab50 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ab60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ab70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ab80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2ab90 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2aba0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2abb0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
2abc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2abd0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2abe0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2abf0 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65  pCur->ix = pPage
2ac00 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
2ac10 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2ac20 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
2ac30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ac40 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
2ac50 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
2ac60 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
2ac70 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2ac80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
2ac90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2aca0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2acb0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2acc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2acd0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2ace0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2acf0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2ad00 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2ad10 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
2ad20 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
2ad30 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
2ad40 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
2ad50 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
2ad60 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
2ad70 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
2ad80 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2ad90 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
2ada0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2adb0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2adc0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2add0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ade0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2adf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ae00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2ae10 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2ae20 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2ae30 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2ae40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ae50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2ae60 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2ae70 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2ae80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2ae90 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
2aea0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2aeb0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2aec0 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61  E_EMPTY ){.    a
2aed0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2aee0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2aef0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
2af00 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
2af10 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2af20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
2af30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2af40 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2af50 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2af60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2af70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2af80 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2af90 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2afa0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2afb0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2afc0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2afd0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2afe0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2aff0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2b000 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
2b010 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2b020 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2b030 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
2b040 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2b050 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2b060 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2b070 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2b080 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2b090 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
2b0a0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
2b0b0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
2b0c0 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
2b0d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
2b0e0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
2b0f0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2b100 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2b110 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2b120 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
2b130 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2b140 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
2b150 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
2b160 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
2b170 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
2b180 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
2b190 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2b1a0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
2b1b0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2b1c0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
2b1d0 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
2b1e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b1f0 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
2b200 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
2b210 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
2b220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b230 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61  r->ix==pCur->pPa
2b240 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  ge->nCell-1 );. 
2b250 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b260 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  >pPage->leaf );.
2b270 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2b280 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b290 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2b2a0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2b2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b2c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2b2d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b2e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
2b2f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
2b300 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2b310 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ost(pCur);.    i
2b320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b330 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
2b340 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2b350 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c  _AtLast;.    }el
2b360 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
2b370 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2b380 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a  F_AtLast;.    }.
2b390 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2b3a0 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
2b3b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2b3c0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2b3d0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2b3e0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ell==0 );.    *p
2b3f0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  Res = 1;.    rc 
2b400 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2b410 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b420 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2b430 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
2b440 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
2b450 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
2b460 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
2b470 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
2b480 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
2b490 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
2b4a0 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
2b4b0 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
2b4c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
2b4d0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
2b4e0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
2b4f0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
2b500 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
2b510 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
2b520 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
2b530 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
2b540 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
2b550 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2b560 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
2b570 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2b580 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2b590 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
2b5a0 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
2b5b0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
2b5c0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
2b5d0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
2b5e0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
2b5f0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
2b600 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
2b610 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
2b620 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
2b630 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
2b640 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
2b650 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
2b660 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
2b670 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
2b680 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
2b690 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
2b6a0 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
2b6b0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
2b6c0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2b6d0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
2b6e0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2b6f0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2b700 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2b710 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2b720 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
2b730 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2b740 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
2b750 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
2b760 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2b770 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
2b780 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
2b790 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
2b7a0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
2b7b0 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
2b7c0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2b7d0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2b7e0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2b800 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
2b810 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2b820 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
2b830 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2b840 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b850 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2b860 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2b870 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
2b880 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2b890 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  xKey..**.** For 
2b8a0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68  index tables, th
2b8b0 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65  e pIdxKey->eqSee
2b8c0 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  n field is set t
2b8d0 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  o 1 if there.** 
2b8e0 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20  exists an entry 
2b8f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
2b900 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2b910 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a  s pIdxKey.  .*/.
2b920 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b930 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
2b940 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2b950 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2b960 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
2b970 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
2b980 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
2b990 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
2b9a0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
2b9b0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
2b9c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2b9d0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
2b9e0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
2b9f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
2ba00 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
2ba10 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
2ba20 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
2ba50 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2ba60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
2ba70 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
2ba80 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
2ba90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2baa0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2bab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2bac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2bad0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2bae0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2baf0 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
2bb00 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
2bb10 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
2bb20 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20  eyInfo==0) );.  
2bb30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2bb40 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2bb50 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d  ID || (pIdxKey==
2bb60 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e  0)==(pCur->curIn
2bb70 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f  tKey!=0) );..  /
2bb80 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2bb90 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
2bba0 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
2bbb0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
2bbc0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
2bbd0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2bbe0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2bbf0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
2bc00 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20  f( pIdxKey==0.  
2bc10 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
2bc20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2bc30 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2bc40 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2bc50 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ey)!=0.  ){.    
2bc60 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2bc70 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2bc80 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2bc90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2bca0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2bcb0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2bcc0 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
2bcd0 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
2bce0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2bcf0 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20  _AtLast)!=0 ){. 
2bd00 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d         *pRes = -
2bd10 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2bd20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2bd30 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66     }.      /* If
2bd40 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b   the requested k
2bd50 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74  ey is one more t
2bd60 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
2bd70 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20   key, then.     
2bd80 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74   ** try to get t
2bd90 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74  here using sqlit
2bda0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61  e3BtreeNext() ra
2bdb0 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ther than a full
2bdc0 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79  .      ** binary
2bdd0 20 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69   search.  This i
2bde0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2bdf0 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72  n only.  The cor
2be00 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20  rect answer.    
2be10 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62    ** is still ob
2be20 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74  tained without t
2be30 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61  his case, only a
2be40 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f   little more slo
2be50 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  wely */.      if
2be60 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2be70 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21  y+1==intKey && !
2be80 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2be90 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2bea0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2beb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
2bec0 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  xt(pCur, 0);.   
2bed0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2bee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bef0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
2bf00 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pCur);.         
2bf10 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2bf20 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2bf40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bf50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf60 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2bf70 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
2bf80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2bf90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2bfa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bfb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bfc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2bfd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2bfe0 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
2bff0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2c000 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
2c010 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
2c020 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72  .    pIdxKey->er
2c030 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61  rCode = 0;.    a
2c040 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
2c050 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20  default_rc==1 . 
2c060 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2c070 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2c080 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  0 .         || p
2c090 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2c0a0 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20  rc==-1.    );.  
2c0b0 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f  }else{.    xReco
2c0c0 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f  rdCompare = 0; /
2c0d0 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69  * All keys are i
2c0e0 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a  ntegers */.  }..
2c0f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2c100 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2c110 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  c ){.    if( rc=
2c120 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2c130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c140 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2c150 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
2c160 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2c170 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2c180 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c190 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2c1a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c1b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c1c0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
2c1d0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
2c1e0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
2c1f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c200 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2c210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c220 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e  ->pPage->nCell >
2c230 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   0 );.  assert( 
2c240 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c  pCur->iPage==0 |
2c250 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  | pCur->apPage[0
2c260 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d  ]->intKey==pCur-
2c270 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
2c280 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
2c290 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  rIntKey || pIdxK
2c2a0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
2c2b0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
2c2c0 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
2c2d0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
2c2e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2c2f0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2c300 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2c330 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
2c340 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
2c350 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
2c360 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
2c370 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
2c380 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
2c390 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
2c3a0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
2c3b0 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
2c3c0 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
2c3d0 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
2c3e0 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
2c3f0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
2c400 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
2c410 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
2c420 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
2c430 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
2c440 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
2c450 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
2c460 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
2c470 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
2c480 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
2c490 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
2c4a0 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
2c4b0 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
2c4c0 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
2c4d0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
2c4e0 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
2c4f0 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
2c500 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2c510 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2c520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c530 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
2c540 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
2c550 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
2c560 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
2c570 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
2c580 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
2c590 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
2c5a0 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
2c5b0 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
2c5c0 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
2c5d0 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
2c5e0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
2c5f0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2c600 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
2c610 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
2c620 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2c630 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
2c640 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
2c650 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2c660 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2c670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2c680 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
2c690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
2c6a0 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43  le( 0x80 <= *(pC
2c6b0 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  ell++) ){.      
2c6c0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e        if( pCell>
2c6d0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2c6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c6f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c700 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
2c710 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
2c720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c740 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2c750 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2c760 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2c770 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2c780 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2c790 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2c7a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2c7b0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2c7c0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2c7d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2c7e0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2c7f0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2c800 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2c810 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2c820 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2c830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c840 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c850 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2c860 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2c870 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2c880 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2c890 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2c8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2c8b0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2c8c0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c8d0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2c8e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c8f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c900 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2c910 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2c920 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2c930 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2c940 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2c950 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2c960 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c970 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2c980 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c9b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c9c0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2c9d0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2c9e0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2c9f0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2ca00 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2ca10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2ca20 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2ca30 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2ca40 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2ca50 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2ca60 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2ca70 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2ca80 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2ca90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2caa0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2cab0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2cac0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2cad0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2cae0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2caf0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2cb00 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2cb10 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2cb20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2cb30 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2cb40 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2cb50 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2cb60 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2cb70 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2cb80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2cb90 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2cba0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2cbb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2cbc0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2cbd0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2cbe0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2cbf0 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2cc00 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2cc10 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2cc20 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2cc30 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2cc40 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2cc50 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2cc60 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2cc70 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2cc80 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2cc90 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2cca0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2ccb0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2ccc0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2ccd0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2cce0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2ccf0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2cd00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2cd10 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2cd20 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2cd30 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2cd40 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2cd50 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2cd60 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2cd70 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2cd80 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2cd90 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2cda0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2cdb0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2cdc0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2cdd0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2cde0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2cdf0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2ce00 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2ce10 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2ce20 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2ce30 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2ce40 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2ce50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2ce60 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2ce70 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2ce80 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2ce90 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2cea0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2ceb0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2cec0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2ced0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2cee0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2cef0 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2cf00 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2cf10 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2cf20 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2cf30 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2cf40 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2cf50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cf60 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2cf70 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2cf80 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2cf90 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2cfa0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2cfb0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2cfc0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2cfd0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2cfe0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2cff0 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2d000 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2d010 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2d020 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2d030 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2d040 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2d050 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2d060 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2d070 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2d080 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2d090 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2d0a0 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2d0b0 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2d0c0 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2d0d0 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2d0e0 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2d0f0 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2d100 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2d110 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2d120 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2d130 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2d140 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2d150 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2d160 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2d170 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2d180 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2d190 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2d1a0 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2d1b0 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2d1c0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2d1d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2d1e0 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2d1f0 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2d200 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2d210 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2d220 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2d230 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2d240 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2d250 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2d260 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2d270 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2d280 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2d290 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2d2a0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2d2b0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2d2c0 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2d2d0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2d2e0 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2d2f0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2d300 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2d310 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2d320 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2d330 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2d340 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2d350 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2d360 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2d370 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
2d390 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
2d3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2d3b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2d3c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d3d0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2d3e0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2d3f0 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2d400 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2d410 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2d420 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d430 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d440 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2d450 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2d460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d470 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2d480 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2d490 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2d4a0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2d4b0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2d4c0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2d4d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  0);.          pC
2d4e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2d4f0 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b  ~BTCF_ValidOvfl;
2d500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d510 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2d520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2d530 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2d540 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d550 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2d560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2d570 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2d580 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2d590 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2d5a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d5b0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2d5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d5d0 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2d5e0 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2d5f0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2d600 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2d610 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2d620 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2d630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2d640 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2d650 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2d660 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2d670 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2d680 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2d690 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2d6a0 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2d6b0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2d6c0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2d6d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2d6e0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2d6f0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d700 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2d710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2d720 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2d730 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2d740 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2d750 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2d760 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2d770 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2d780 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2d790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d7a0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2d7b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2d7c0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2d7d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2d7e0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2d7f0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2d800 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2d810 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2d820 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2d830 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2d840 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2d850 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2d860 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2d870 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2d880 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2d890 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2d8a0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2d8b0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
2d8c0 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2d8d0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
2d8e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2d8f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
2d900 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2d910 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
2d920 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
2d930 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
2d940 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
2d950 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2d960 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2d970 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2d980 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2d990 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2d9a0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2d9b0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
2d9c0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78    }.    pCur->ix
2d9d0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
2d9e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2d9f0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
2da00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2da10 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
2da20 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
2da30 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2da40 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2da50 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2da60 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2da70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2da80 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2da90 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2daa0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2dab0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2dac0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2dad0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2dae0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2daf0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2db00 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2db10 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2db20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2db30 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2db40 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2db50 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2db60 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2db70 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2db80 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2db90 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2dba0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2dbb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2dbc0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2dbd0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2dbe0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2dbf0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2dc00 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2dc10 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2dc20 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2dc30 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2dc40 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2dc50 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2dc60 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2dc70 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2dc80 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2dc90 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2dca0 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2dcb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2dcc0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72   an estimate for
2dcd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2dce0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2dcf0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
2dd00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52   pointing to.  R
2dd10 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2dd20 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73   number if no es
2dd30 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e  timate is curren
2dd40 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  tly .** availabl
2dd50 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  e..*/.i64 sqlite
2dd60 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
2dd70 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2dd80 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38  ){.  i64 n;.  u8
2dd90 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   i;..  assert( c
2dda0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ddb0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2ddc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ddd0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2dde0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2ddf0 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e   );..  /* Curren
2de00 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61  tly this interfa
2de10 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ce is only calle
2de20 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d  d by the OP_IfSm
2de30 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64  aller.  ** opcod
2de40 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63  e, and it that c
2de50 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ase the cursor w
2de60 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61  ill always be va
2de70 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c  lid and.  ** wil
2de80 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74  l always point t
2de90 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  o a leaf node. *
2dea0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
2deb0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2dec0 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75  OR_VALID) ) retu
2ded0 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56  rn -1;.  if( NEV
2dee0 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ER(pCur->pPage->
2def0 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72  leaf==0) ) retur
2df00 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75  n -1;..  n = pCu
2df10 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  r->pPage->nCell;
2df20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
2df30 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
2df40 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e  .    n *= pCur->
2df50 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c  apPage[i]->nCell
2df60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
2df70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
2df80 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
2df90 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
2dfa0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2dfb0 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75   .** Return valu
2dfc0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  e:.**.**    SQLI
2dfd0 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63  TE_OK        suc
2dfe0 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54  cess.**    SQLIT
2dff0 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73  E_DONE      curs
2e000 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
2e010 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61  inting at the la
2e020 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20  st element.**   
2e030 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20   otherwise      
2e040 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
2e050 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
2e060 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2e070 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2e080 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2e090 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2e0a0 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2e0b0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2e0c0 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
2e0d0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2e0e0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2e0f0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2e100 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
2e110 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2e120 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2e130 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
2e140 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
2e150 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2e160 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2e170 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2e180 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
2e190 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2e1a0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
2e1b0 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
2e1c0 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c   argument in sql
2e1d0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c  ite3BtreeNext(C,
2e1e0 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68  F) is 1, then th
2e1f0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72  e.** cursor corr
2e200 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2e210 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
2e220 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2e230 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
2e240 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
2e250 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
2e260 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
2e270 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  he F argument.**
2e280 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
2e290 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51  e implement.  SQ
2e2a0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2e2b0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2e2c0 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68  ot use.** this h
2e2d0 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
2e2e0 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
2e2f0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2e300 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
2e310 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2e320 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2e330 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2e340 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2e350 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e360 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e370 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2e380 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2e390 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2e3a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
2e3b0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e3c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2e3d0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2e3e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2e3f0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2e400 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
2e410 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2e420 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2e430 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e460 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2e470 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2e480 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e490 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
2e4a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2e4b0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2e4c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2e4d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2e4e0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2e4f0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2e500 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2e510 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e520 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2e530 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2e540 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2e550 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e560 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2e570 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e580 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2e590 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e5a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2e5b0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2e5c0 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
2e5d0 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ->ix;.  assert( 
2e5e0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2e5f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2e600 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
2e610 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
2e620 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
2e630 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
2e640 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
2e650 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
2e660 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
2e670 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
2e680 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
2e690 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
2e6a0 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
2e6b0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2e6c0 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
2e6d0 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
2e6e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2e6f0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
2e700 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
2e710 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
2e720 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
2e730 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
2e740 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
2e750 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
2e760 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
2e770 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
2e780 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
2e790 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e7a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2e7b0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2e7c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2e7d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2e7e0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
2e7f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e800 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
2e810 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2e820 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
2e830 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
2e840 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2e850 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
2e860 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2e870 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
2e880 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
2e890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e8a0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2e8b0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
2e8c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2e8d0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2e8e0 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  >ix>=pPage->nCel
2e8f0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2e900 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2e910 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2e920 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2e930 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
2e940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2e950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2e960 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2e970 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2e980 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e990 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2e9a0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2e9b0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
2e9c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
2e9d0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2e9e0 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
2e9f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2ea00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ea10 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
2ea20 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
2ea30 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
2ea40 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65  SQLite */.  asse
2ea50 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ea60 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ea70 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
2ea80 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
2ea90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2eaa0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2eab0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2eac0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2ead0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2eae0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2eaf0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2eb00 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2eb10 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
2eb20 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2eb30 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2eb40 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2eb50 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20  (pCur);.  pPage 
2eb60 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2eb70 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78   if( (++pCur->ix
2eb80 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
2eb90 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ){.    pCur->ix-
2eba0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
2ebb0 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20  reeNext(pCur);. 
2ebc0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2ebd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2ebe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ebf0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2ec00 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2ec10 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
2ec20 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
2ec30 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
2ec40 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2ec50 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2ec60 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72  tabase..** Retur
2ec70 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  n values:.**.** 
2ec80 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
2ec90 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
2eca0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74   SQLITE_DONE   t
2ecb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
2ecc0 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73  eady on the firs
2ecd0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
2ece0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74   table.**     ot
2ecf0 68 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65  herwise     some
2ed00 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
2ed10 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
2ed20 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2ed30 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2ed40 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2ed50 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2ed60 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2ed70 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2ed80 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2ed90 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2eda0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2edb0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2edc0 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2edd0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2ede0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2edf0 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2ee00 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2ee10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2ee20 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2ee30 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2ee40 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2ee50 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2ee60 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2ee70 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
2ee80 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
2ee90 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
2eea0 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20  revious(C,F) is 
2eeb0 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  1, then.** the c
2eec0 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2eed0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2eee0 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
2eef0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2ef00 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
2ef10 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
2ef20 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
2ef30 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
2ef40 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
2ef50 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
2ef60 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69  ement.  The nati
2ef70 76 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ve SQLite btree 
2ef80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2ef90 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74  oes not.** use t
2efa0 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
2efb0 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
2efc0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2efd0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72  LINE int btreePr
2efe0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2eff0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
2f000 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2f010 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2f020 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2f030 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2f040 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2f050 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2f060 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f070 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2f080 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2f090 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2f0a0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2f0b0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2f0c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2f0d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f0e0 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2f0f0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f100 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2f110 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2f120 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2f130 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f150 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f160 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2f170 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2f180 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2f190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2f1a0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
2f1b0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2f1c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f1d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2f1e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2f1f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2f200 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2f210 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2f220 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2f230 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2f240 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
2f250 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2f260 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2f270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f280 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2f290 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2f2a0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2f2b0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2f2c0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2f2d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2f2e0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
2f2f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f300 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
2f310 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  >ix;.    rc = mo
2f320 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2f330 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2f340 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
2f350 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2f360 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
2f370 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2f380 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2f390 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
2f3a0 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  r->ix==0 ){.    
2f3b0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2f3c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2f3d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f3e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2f3f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f400 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
2f410 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2f420 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2f430 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2f440 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2f450 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2f460 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2f470 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
2f480 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
2f490 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
2f4a0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
2f4b0 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Page;.    if( pP
2f4c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2f4d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f4e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f4f0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2f500 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
2f510 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2f520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f540 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f550 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2f560 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2f570 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
2f580 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f590 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f5a0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
2f5b0 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
2f5c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f5d0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2f5e0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f5f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55  SOR_VALID );.  U
2f600 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f610 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
2f620 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
2f630 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
2f640 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
2f650 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f660 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2f670 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2f680 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2f690 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2f6a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f6b0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f6c0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
2f6d0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70  =0.   || pCur->p
2f6e0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  Page->leaf==0.  
2f6f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2f700 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2f710 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  );.  }.  pCur->i
2f720 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x--;.  return SQ
2f730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2f740 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2f750 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
2f760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2f770 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
2f780 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
2f790 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
2f7a0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
2f7b0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
2f7c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2f7d0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
2f7e0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
2f7f0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
2f800 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
2f810 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
2f820 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
2f830 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
2f840 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
2f850 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
2f860 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
2f870 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
2f880 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2f890 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
2f8a0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
2f8b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
2f8c0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
2f8d0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
2f8e0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
2f8f0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
2f900 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
2f910 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
2f920 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
2f930 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
2f940 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
2f950 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
2f960 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
2f970 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
2f980 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2f990 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
2f9a0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
2f9b0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
2f9c0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
2f9d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f9e0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
2f9f0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
2fa00 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
2fa10 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
2fa20 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
2fa30 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
2fa40 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
2fa50 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
2fa60 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
2fa70 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
2fa80 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2fa90 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
2faa0 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
2fab0 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
2fac0 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
2fad0 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
2fae0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
2faf0 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
2fb00 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
2fb10 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
2fb20 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
2fb30 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
2fb40 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
2fb50 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
2fb60 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2fb70 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
2fb80 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
2fb90 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2fba0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
2fbb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
2fbc0 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
2fbd0 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
2fbe0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2fbf0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
2fc00 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
2fc10 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
2fc20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
2fc30 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
2fc40 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
2fc50 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
2fc60 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
2fc70 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
2fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc90 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
2fca0 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
2fcb0 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
2fcc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2fcd0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
2fce0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
2fcf0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2fd00 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
2fd10 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
2fd20 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
2fd30 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
2fd40 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
2fd50 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
2fd60 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
2fd70 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
2fd80 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
2fd90 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
2fda0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2fdb0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2fdc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2fdd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2fde0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2fdf0 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
2fe00 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
2fe10 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
2fe20 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
2fe30 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
2fe40 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
2fe50 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
2fe60 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
2fe70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2fe80 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
2fe90 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2fea0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2feb0 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
2fec0 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
2fed0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2fee0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2fef0 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
2ff00 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2ff10 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2ff20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2ff30 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2ff40 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2ff50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ff60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ff70 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2ff80 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2ff90 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ffa0 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2ffb0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2ffc0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2ffd0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2ffe0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2fff0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
30000 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
30010 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
30020 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63  /.    u32 nSearc
30030 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e  h = 0;   /* Coun
30040 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
30050 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70  of search attemp
30060 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  ts */.    .    /
30070 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
30080 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
30090 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
300a0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
300b0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
300c0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
300d0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
300e0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
300f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
30100 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
30110 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
30120 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
30130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30140 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30150 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
30160 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
30170 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
30180 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
30190 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
301a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
301b0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
301c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
301d0 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
301e0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
301f0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
30200 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
30210 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
30220 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
30230 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
30240 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
30250 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
30260 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
30270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30280 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
30290 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
302a0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
302b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
302c0 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
302d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
302e0 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
302f0 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
30300 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
30310 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
30320 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
30330 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
30340 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
30350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30360 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
30370 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30380 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30390 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
303a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
303b0 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
303c0 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
303d0 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
303e0 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
303f0 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
30400 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
30410 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
30420 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
30430 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
30440 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
30450 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
30460 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
30470 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
30480 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
30490 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
304a0 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
304b0 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
304c0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
304d0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
304e0 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
304f0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
30500 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
30510 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
30520 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
30530 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
30540 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
30550 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
30560 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
30570 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
30580 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
30590 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
305a0 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
305b0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
305c0 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
305d0 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
305e0 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
305f0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
30600 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
30610 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
30620 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
30630 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
30640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
30650 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
30660 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
30670 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
30680 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
30690 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
306a0 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
306b0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
306c0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
306d0 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
306e0 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
306f0 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
30700 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
30710 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
30720 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
30730 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
30740 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
30750 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
30760 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
30770 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61  k>mxPage || nSea
30780 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20  rch++ > n ){.   
30790 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
307a0 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
307b0 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76  revTrunk ? pPrev
307c0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29  Trunk->pgno : 1)
307d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
307e0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
307f0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30800 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
30810 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
30820 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
30830 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
30840 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
30850 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30860 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
30870 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
30880 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
30890 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
308a0 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
308b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
308c0 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
308d0 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
308e0 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
308f0 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
30900 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
30910 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
30920 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
30930 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
30940 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
30950 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
30960 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
30970 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
30980 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
30990 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
309a0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
309b0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
309c0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
309d0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
309e0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
309f0 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
30a00 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
30a10 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
30a20 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
30a30 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
30a40 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
30a50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30a60 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
30a70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
30a80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30a90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
30aa0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
30ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
30ac0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
30ad0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30ae0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
30af0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
30b00 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
30b10 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
30b20 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
30b30 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
30b40 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
30b50 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
30b60 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
30b70 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
30b80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
30b90 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
30ba0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
30bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
30bc0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
30bd0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
30be0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
30bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
30c00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30c10 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
30c20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30c30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
30c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30c50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30c60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
30c70 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
30c80 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
30c90 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
30ca0 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
30cb0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
30cc0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
30cd0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
30ce0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
30cf0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
30d00 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
30d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
30d20 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
30d30 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
30d40 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
30d50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30d60 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
30d70 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
30d80 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
30d90 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
30da0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
30db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30dc0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
30dd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
30de0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
30df0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30e00 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30e10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
30e20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
30e30 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
30e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30e50 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
30e60 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
30e70 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
30e80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30e90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
30ea0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30eb0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
30ec0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30ed0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ef0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
30f00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30f10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
30f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
30f30 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
30f40 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
30f50 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
30f60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30f70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30f80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
30f90 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
30fa0 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
30fb0 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
30fc0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
30fd0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
30fe0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
30ff0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
31000 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
31010 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
31020 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
31030 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31040 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
31050 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
31060 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
31070 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
31080 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
31090 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
310a0 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
310b0 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
310c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
310d0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
310e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
310f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31100 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
31110 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
31120 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
31130 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
31140 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
31150 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
31160 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
31170 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
31180 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
311a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
311b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
311c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
311d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
311e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
311f0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
31200 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31220 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
31230 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
31240 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
31250 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31260 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
31270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
31280 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
31290 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
312a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
312b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
312c0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
312d0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
312e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
312f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
31300 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
31310 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
31320 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
31330 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
31340 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
31350 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
31360 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
31370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31380 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
31390 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
313a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
313b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
313c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
313d0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
313e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
313f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31400 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31410 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
31420 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
31430 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31440 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
31450 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31460 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31470 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
31480 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
31490 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
314a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
314b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
314c0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
314d0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
314e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
314f0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
31500 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
31510 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
31520 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
31530 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
31540 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
31550 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
31560 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
31570 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
31580 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
31590 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
315a0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
315b0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
315c0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
315d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
315e0 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
315f0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
31600 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
31610 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
31620 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
31630 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
31650 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
31660 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
31670 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
31680 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
31690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
316a0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
316c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
316d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
316e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
316f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
31700 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
31710 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
31720 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
31730 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
31740 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
31750 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
31760 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
31770 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
31780 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
31790 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
317a0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
317b0 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
317c0 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
317d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
317e0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
317f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31800 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
31810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
31840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
31850 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
31860 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
31870 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
31880 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
31890 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
318a0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
318b0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
318c0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
318d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
318e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
318f0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
31900 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31910 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31920 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
31930 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
31940 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
31950 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
31960 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
31970 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
31980 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
31990 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
319a0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
319b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
319c0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
319d0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
319e0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
319f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
31a00 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
31a10 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
31a20 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
31a30 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
31a40 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
31a50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31a60 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
31a70 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
31a80 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
31a90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31aa0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31ab0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
31ac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31ad0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
31ae0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31af0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
31b00 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
31b10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
31b20 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
31b30 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
31b40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
31b50 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
31b60 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
31b70 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
31b80 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
31b90 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
31ba0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
31bb0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
31bc0 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
31bd0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31be0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
31bf0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
31c00 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
31c10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31c40 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
31c50 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
31c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31c70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31c90 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
31ca0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31cb0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
31cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31cd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31ce0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
31cf0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
31d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
31d10 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
31d20 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
31d30 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
31d40 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
31d50 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
31d60 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
31d70 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
31d80 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
31d90 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
31da0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
31db0 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
31dc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
31dd0 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
31de0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
31df0 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
31e00 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
31e10 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
31e20 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
31e30 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
31e40 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
31e50 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
31e60 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
31e70 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
31e80 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
31e90 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
31ea0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
31eb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
31ec0 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
31ed0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
31ee0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
31ef0 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
31f00 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
31f10 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
31f20 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
31f30 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
31f40 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
31f50 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
31f60 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
31f70 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
31f80 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
31f90 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
31fa0 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
31fb0 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
31fc0 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
31fd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
31fe0 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
31ff0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
32000 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
32010 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
32020 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
32030 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
32040 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
32050 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
32060 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
32070 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
32080 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
32090 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
320a0 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
320b0 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
320c0 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
320d0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
320e0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
320f0 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
32100 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
32110 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
32120 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
32130 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
32140 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
32150 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
32160 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
32170 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
32180 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
32190 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
321a0 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
321b0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
321c0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
321d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
321e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
321f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
32200 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32210 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
32220 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
32230 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
32240 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
32250 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
32260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32270 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
32280 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
32290 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
322a0 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
322b0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
322c0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
322d0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
322e0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
322f0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
32300 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
32310 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
32320 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
32330 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
32340 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
32350 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
32360 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
32370 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
32380 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
32390 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
323a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
323b0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
323c0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
323d0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
323e0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
323f0 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
32400 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
32410 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
32420 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
32430 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
32440 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32450 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
32460 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
32470 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
32480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
324a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
324b0 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
324c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
324d0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
324e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
324f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
32500 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
32510 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
32520 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
32530 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32540 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
32550 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
32560 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
32570 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
32580 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
32590 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
325a0 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
325b0 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
325c0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
325d0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
325e0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
325f0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
32600 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
32610 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
32620 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
32630 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
32640 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32650 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
32660 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
32670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32680 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
32690 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
326a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
326b0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
326c0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
326d0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
326e0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
326f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
32700 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
32710 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
32720 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32730 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
32740 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
32750 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
32760 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
32770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32780 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
32790 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
327a0 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
327b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
327c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
327d0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
327e0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
327f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
32800 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
32810 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
32820 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
32830 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
32840 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
32850 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
32860 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
32870 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
32880 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
32890 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
328a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
328b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
328c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
328d0 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
328e0 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
328f0 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
32900 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
32910 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
32920 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
32930 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
32940 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
32950 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
32960 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
32970 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
32980 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
32990 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
329a0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
329b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
329c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
329d0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
329e0 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
329f0 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
32a00 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
32a10 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
32a20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
32a30 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
32a40 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
32a50 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
32a60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
32a70 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
32a80 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
32a90 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ab0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
32ac0 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
32ad0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
32ae0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
32af0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
32b00 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
32b10 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
32b20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
32b30 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
32b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
32b50 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
32b60 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
32b70 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32ba0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
32bb0 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
32bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32bd0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
32be0 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
32bf0 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
32c00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
32c10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
32c20 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
32c30 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
32c40 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
32c50 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
32c60 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
32c70 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
32c80 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e  iPage<2 ) return
32c90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32ca0 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d  BKPT;.  if( pMem
32cb0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
32cc0 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
32cd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
32ce0 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
32cf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
32d00 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
32d10 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
32d20 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
32d30 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
32d40 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
32d50 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
32d60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32d70 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
32d80 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
32d90 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32da0 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
32db0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32dc0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
32dd0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32de0 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
32df0 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
32e00 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
32e10 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
32e20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
32e30 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
32e40 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
32e50 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
32e60 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
32e70 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
32e80 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
32e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32ea0 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
32eb0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
32ec0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
32ed0 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
32ee0 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
32ef0 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
32f00 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
32f10 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
32f20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
32f30 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32f40 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
32f50 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
32f60 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
32f70 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
32f80 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
32f90 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
32fa0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
32fb0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
32fc0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
32fd0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
32fe0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
32ff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
33000 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
33010 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
33020 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
33030 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
33040 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
33050 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33060 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
33070 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
33080 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
33090 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
330a0 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
330b0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
330c0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
330d0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
330e0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
330f0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
33100 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
33110 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
33120 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
33130 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
33140 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
33150 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
33160 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
33170 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
33180 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
33190 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
331a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
331b0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
331c0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
331d0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
331e0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
331f0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
33200 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
33210 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
33220 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
33230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33240 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
33250 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
33260 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
33270 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
33280 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
33290 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
332a0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
332b0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
332c0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
332d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
332e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
332f0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
33300 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
33310 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
33320 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
33330 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
33340 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
33350 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
33360 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
33370 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
33380 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
33390 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
333a0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
333b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
333c0 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
333d0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
333e0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
333f0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
33400 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
33410 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
33420 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
33430 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
33440 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
33450 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
33460 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
33470 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
33480 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
33490 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
334a0 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
334b0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
334c0 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
334d0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
334e0 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
334f0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
33500 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
33510 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
33520 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
33530 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
33540 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
33550 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
33560 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
33570 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
33580 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
33590 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
335a0 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
335b0 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
335c0 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
335d0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
335e0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
335f0 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
33600 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
33610 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
33620 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
33630 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
33640 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
33650 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
33660 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
33670 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
33680 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
33690 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
336a0 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
336b0 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
336c0 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
336d0 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
336e0 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
336f0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
33700 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
33710 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
33720 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
33730 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
33740 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
33750 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
33760 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
33770 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
33780 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
33790 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
337a0 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
337b0 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
337c0 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
337d0 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
337e0 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
337f0 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
33800 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
33810 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
33820 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
33830 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
33840 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
33850 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
33860 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
33870 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33880 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
33890 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
338a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
338b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
338c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
338d0 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
338e0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
338f0 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
33900 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
33910 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
33920 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
33930 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
33940 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
33950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
33960 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
33970 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
33980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33990 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
339a0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
339b0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
339c0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
339d0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
339e0 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
339f0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
33a00 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
33a10 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
33a20 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
33a30 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
33a40 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
33a50 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
33a60 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
33a70 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
33a80 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
33a90 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
33aa0 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
33ab0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
33ac0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
33ad0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
33ae0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
33af0 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
33b00 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
33b10 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
33b20 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
33b30 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
33b40 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
33b50 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
33b60 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
33b70 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
33b80 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
33b90 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
33ba0 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
33bb0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
33bc0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
33bd0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
33be0 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
33bf0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
33c00 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
33c10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
33c20 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
33c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33c40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
33c50 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
33c60 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
33c70 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
33c80 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
33c90 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
33ca0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
33cb0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
33cc0 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
33cd0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
33ce0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
33cf0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
33d00 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
33d10 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
33d20 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
33d30 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
33d40 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
33d50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
33d60 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
33d70 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
33d80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
33d90 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
33da0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
33db0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
33dc0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
33dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
33de0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
33df0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
33e00 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
33e10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
33e20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
33e30 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
33e40 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
33e50 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
33e60 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
33e70 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
33e80 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
33e90 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
33ea0 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
33eb0 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
33ec0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
33ed0 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
33ee0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
33ef0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
33f00 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
33f10 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
33f20 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
33f30 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
33f40 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
33f50 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
33f60 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo          /* 
33f70 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  Size information
33f80 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20   about the cell 
33f90 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
33fa0 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76   *pBt;.  Pgno ov
33fb0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
33fc0 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
33fd0 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
33fe0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
33ff0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
34000 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
34010 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
34020 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
34030 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
34040 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
34050 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61  ocal==pInfo->nPa
34060 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
34070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
34080 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
34090 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
340a0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
340b0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
340c0 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53   pCell+pInfo->nS
340d0 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
340e0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
340f0 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  Page ){.    /* C
34100 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
34110 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
34120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34130 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
34140 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
34150 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
34160 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
34170 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
34180 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
34190 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
341a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
341b0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
341c0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
341d0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
341e0 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e  Ovfl = (pInfo->n
341f0 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d  Payload - pInfo-
34200 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  >nLocal + ovflPa
34210 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
34220 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
34230 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a  rt( nOvfl>0 || .
34240 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20      (CORRUPT_DB 
34250 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  && (pInfo->nPayl
34260 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  oad + ovflPageSi
34270 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65  ze)<ovflPageSize
34280 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
34290 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
342a0 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
342b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
342c0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
342d0 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
342e0 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
342f0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
34300 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
34310 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
34320 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
34330 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
34340 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
34350 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
34360 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
34370 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
34380 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
34390 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
343a0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
343b0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
343c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
343d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
343e0 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
343f0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
34400 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
34410 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
34420 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
34430 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34440 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
34450 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
34460 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
34470 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
34480 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
34490 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
344a0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
344b0 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
344c0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
344d0 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
344e0 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
344f0 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
34500 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
34510 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
34520 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
34530 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
34540 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
34550 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
34560 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
34570 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
34580 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
34590 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
345a0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
345b0 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
345c0 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
345d0 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
345e0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
345f0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
34600 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
34610 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
34620 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
34630 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
34640 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
34650 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
34660 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
34670 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
34680 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
34690 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
346a0 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
346b0 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
346c0 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
346d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
346e0 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
346f0 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
34700 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
34710 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
34720 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
34730 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
34740 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34750 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34770 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
34780 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
34790 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
347a0 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
347b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
347c0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
347d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
347e0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
347f0 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
34800 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
34810 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34820 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
34830 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
34840 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
34850 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
34860 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
34870 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
34880 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
34890 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
348a0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
348b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
348c0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
348d0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
348e0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
348f0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
34900 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
34910 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
34920 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
34930 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
34940 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
34950 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
34960 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
34970 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
34980 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
34990 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
349a0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
349b0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
349c0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
349d0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
349e0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
349f0 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
34a00 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
34a10 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
34a20 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
34a30 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
34a40 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
34a50 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
34a60 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
34a70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
34a80 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
34a90 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
34aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
34ab0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
34ac0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
34ad0 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a  t BtreePayload *
34ae0 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  pX,        /* Pa
34af0 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68  yload with which
34b00 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
34b10 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
34b20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
34b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
34b40 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
34b50 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
34b60 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
34b70 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
34b80 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e   nSrc, n, rc, mn
34b90 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
34ba0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  t;.  MemPage *pT
34bb0 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69  oRelease;.  unsi
34bc0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
34bd0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
34be0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
34bf0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
34c00 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a   Pgno pgnoOvfl;.
34c10 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
34c20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34c30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
34c40 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
34c50 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
34c60 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
34c70 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
34c80 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
34c90 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
34ca0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
34cb0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
34cc0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
34cd0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
34ce0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
34cf0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
34d00 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
34d10 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67  [pPage->pBt->pag
34d20 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
34d30 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
34d40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34d50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
34d60 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
34d70 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
34d80 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d  nHeader = pPage-
34d90 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
34da0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
34db0 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  ey ){.    nPaylo
34dc0 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b  ad = pX->nData +
34dd0 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20   pX->nZero;.    
34de0 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61  pSrc = pX->pData
34df0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d  ;.    nSrc = pX-
34e00 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >nData;.    asse
34e10 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
34e20 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c  yLeaf ); /* fill
34e30 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61  InCell() only ca
34e40 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20  lled for leaves 
34e50 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  */.    nHeader +
34e60 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
34e70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
34e80 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48  Payload);.    nH
34e90 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
34ea0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
34eb0 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e  r], *(u64*)&pX->
34ec0 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
34ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
34ee0 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66  nKey<=0x7fffffff
34ef0 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20   && pX->pKey!=0 
34f00 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50  );.    nSrc = nP
34f10 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58  ayload = (int)pX
34f20 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  ->nKey;.    pSrc
34f30 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20   = pX->pKey;.   
34f40 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
34f50 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
34f60 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
34f70 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  d);.  }.  .  /* 
34f80 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
34f90 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61  oad */.  pPayloa
34fa0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
34fb0 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  er];.  if( nPayl
34fc0 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
34fd0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
34fe0 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  his is the commo
34ff0 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76 65  n case where eve
35000 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20  rything fits on 
35010 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a 20  the btree page. 
35020 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65     ** and no ove
35030 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
35040 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
35050 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
35060 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
35070 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
35080 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
35090 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
350a0 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
350b0 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61  nSize = n;.    a
350c0 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61  ssert( nSrc<=nPa
350d0 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73  yload );.    tes
350e0 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79  tcase( nSrc<nPay
350f0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63  load );.    memc
35100 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
35110 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65  c, nSrc);.    me
35120 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53  mset(pPayload+nS
35130 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d  rc, 0, nPayload-
35140 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  nSrc);.    retur
35150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
35160 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
35170 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
35180 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  t means that som
35190 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
351a0 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20   will need.  ** 
351b0 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76  to spill onto ov
351c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
351d0 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d  */.  mn = pPage-
351e0 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d  >minLocal;.  n =
351f0 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
35200 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
35210 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35220 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  - 4);.  testcase
35230 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
35240 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
35250 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
35260 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
35270 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
35280 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
35290 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b    spaceLeft = n;
352a0 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b  .  *pnSize = n +
352b0 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
352c0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
352d0 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54  nHeader+n];.  pT
352e0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
352f0 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
35300 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
35310 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
35320 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20  point variables 
35330 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73  should be set as
35340 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
35350 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20   **   nPayload  
35360 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70           Total p
35370 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62  ayload size in b
35380 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79  ytes.  **   pPay
35390 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42  load           B
353a0 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79  egin writing pay
353b0 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20  load here.  **  
353c0 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20   spaceLeft      
353d0 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61      Space availa
353e0 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e  ble at pPayload.
353f0 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70    If nPayload>sp
35400 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20  aceLeft,.  **   
35410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35420 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f     that means co
35430 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c  ntent must spill
35440 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
35450 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e  ages..  **   *pn
35460 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
35470 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61  Size of the loca
35480 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e  l cell (not coun
35490 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61  ting overflow pa
354a0 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69  ges).  **   pPri
354b0 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57  or             W
354c0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
354d0 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69  e pgno of the fi
354e0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
354f0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20  e.  **.  ** Use 
35500 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50  a call to btreeP
35510 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f  arseCellPtr() to
35520 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
35530 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20   values above.  
35540 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  ** were computed
35550 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
35560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
35570 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
35580 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
35590 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
355a0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
355b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
355c0 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e  rt( nHeader==(in
355d0 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
355e0 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
355f0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
35600 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a  ey==pX->nKey );.
35610 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
35620 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
35630 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
35640 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
35650 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d  fo.nLocal );.  }
35660 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
35670 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
35680 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
35690 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
356a0 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
356b0 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
356c0 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e  ( 1 ){.    n = n
356d0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
356e0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
356f0 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
35700 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
35710 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
35720 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
35730 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
35740 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
35750 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
35760 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
35770 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
35780 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
35790 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
357a0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
357b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
357c0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
357d0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
357e0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
357f0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
35800 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
35810 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
35820 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
35830 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
35840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35850 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
35860 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
35870 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
35880 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
35890 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
358a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
358b0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
358c0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
358d0 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  nSrc>=n ){.     
358e0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
358f0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
35900 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30  }else if( nSrc>0
35910 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53   ){.      n = nS
35920 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  rc;.      memcpy
35930 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
35940 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
35950 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
35960 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
35970 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
35980 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
35990 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65  Payload<=0 ) bre
359a0 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64  ak;.    pPayload
359b0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
359c0 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
359d0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
359e0 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
359f0 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
35a00 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
35a10 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  pOvfl = 0;.#ifnd
35a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35a30 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
35a40 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
35a50 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
35a60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
35a70 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
35a80 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
35a90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
35ab0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
35ac0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
35ad0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
35ae0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
35af0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
35b00 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
35b10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35b20 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
35b30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
35b40 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
35b50 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
35b60 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
35b70 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
35b80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35b90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
35ba0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35bb0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
35bc0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
35bd0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
35be0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
35bf0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
35c00 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
35c10 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
35c20 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
35c30 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
35c40 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
35c50 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
35c60 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
35c70 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
35c80 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
35c90 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
35ca0 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
35cb0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
35cc0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
35cd0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
35ce0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
35cf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
35d00 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
35d10 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
35d20 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
35d30 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
35d40 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
35d50 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
35d60 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
35d70 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
35d80 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
35d90 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
35da0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35db0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
35dc0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
35dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35de0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
35df0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
35e00 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
35e10 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
35e20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
35e30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
35e40 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
35e50 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
35e60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
35e70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
35e80 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
35e90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
35ea0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35eb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
35ec0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
35ed0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
35ee0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35ef0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
35f00 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
35f10 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
35f20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
35f30 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
35f40 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
35f50 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
35f60 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
35f70 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
35f80 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
35f90 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
35fa0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35fb0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
35fc0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
35fd0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
35fe0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
35ff0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
36000 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
36010 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
36020 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
36030 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
36040 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
36050 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
36060 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
36070 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
36080 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
36090 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
360a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
360b0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
360c0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
360d0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
360e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
360f0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
36100 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
36110 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
36120 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
36130 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
36140 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
36150 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
36160 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
36170 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
36180 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36190 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  - 4;.    }.  }. 
361a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
361b0 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
361c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
361d0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
361e0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
361f0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
36200 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
36210 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
36220 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
36230 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
36240 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
36250 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
36260 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
36270 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
36280 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
36290 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
362a0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
362b0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
362c0 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
362d0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
362e0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
362f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
36300 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
36310 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
36320 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
36330 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
36340 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
36350 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
36360 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
36370 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
36380 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
36390 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
363a0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
363b0 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
363c0 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
363d0 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
363e0 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
363f0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
36400 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
36410 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
36420 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
36430 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
36440 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
36450 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
36460 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
36470 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
36480 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  n;.  assert( idx
36490 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
364a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
364b0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
364c0 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  || sz==cellSize(
364d0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
364e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
364f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36500 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
36510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
36520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36530 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
36540 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
36550 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
36560 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
36570 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
36580 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
36590 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
365a0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
365b0 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
365c0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
365d0 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
365e0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
365f0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36600 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
36610 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26   (u32)get2byte(&
36620 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
36630 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
36640 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
36650 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
36660 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
36670 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
36680 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
36690 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
366a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
366b0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
366c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
366d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
366e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
366f0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
36700 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
36710 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
36720 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
36730 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
36740 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
36750 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
36760 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
36770 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
36780 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
36790 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
367a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367b0 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
367c0 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
367d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
367e0 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
367f0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
36800 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
36810 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
36820 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
36830 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
36840 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
36850 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
36860 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
36870 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
36880 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
36890 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
368a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
368b0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
368c0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
368d0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
368e0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
368f0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
36900 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
36910 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
36920 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
36930 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
36940 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
36950 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
36960 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
36970 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
36980 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
36990 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
369a0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
369b0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
369c0 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
369d0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
369e0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
369f0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
36a00 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
36a10 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
36a20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
36a30 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
36a40 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
36a50 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
36a60 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d  ed..**.** *pRC m
36a70 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b  ust be SQLITE_OK
36a80 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
36a90 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
36aa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
36ab0 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
36ac0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
36ad0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
36ae0 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
36af0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
36b00 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
36b10 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
36b20 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
36b30 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
36b40 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
36b50 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
36b60 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
36b70 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
36b80 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
36b90 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
36ba0 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
36bb0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
36bc0 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
36bd0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
36be0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
36bf0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
36c00 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
36c10 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
36c20 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
36c30 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
36c40 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
36c50 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
36c60 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
36c70 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
36c80 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
36c90 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
36ca0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
36cb0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
36cc0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36cd0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  unter */.  u8 *d
36ce0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
36cf0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
36d00 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
36d10 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20  .  u8 *pIns;    
36d20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
36d30 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  t in pPage->aCel
36d40 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20  lIdx[] where no 
36d50 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f  cell inserted */
36d60 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 43  ..  assert( *pRC
36d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
36d80 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
36d90 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
36da0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
36db0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
36dc0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
36dd0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
36de0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
36df0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
36e00 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
36e10 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
36e20 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
36e30 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
36e40 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
36e50 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
36e60 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
36e70 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
36e80 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
36e90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36ea0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36eb0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
36ec0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
36ed0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
36ee0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
36ef0 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
36f00 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
36f10 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
36f20 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
36f30 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
36f40 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
36f50 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
36f60 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
36f70 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
36f80 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
36f90 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
36fa0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
36fb0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
36fc0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
36fd0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
36fe0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
36ff0 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
37000 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
37010 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
37020 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
37030 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
37040 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
37050 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
37060 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
37070 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
37080 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
37090 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
370a0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
370b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
370c0 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
370d0 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
370e0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
370f0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
37100 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
37110 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
37120 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
37130 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
37140 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ;.    /* Compari
37150 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61  son against Arra
37160 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65  ySize-1 since we
37170 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65   hold back one e
37180 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a  xtra slot.    **
37190 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63   as a contingenc
371a0 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
371b0 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d  ds, never need m
371c0 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66  ore than 3 overf
371d0 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73  low.    ** slots
371e0 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63   but 4 are alloc
371f0 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65  ated, just to be
37200 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73   safe. */.    as
37210 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53  sert( j < ArrayS
37220 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
37230 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l)-1 );.    pPag
37240 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
37250 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
37260 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
37270 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  6)i;..    /* Whe
37280 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
37290 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79  lows occur, they
372a0 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71 75   are always sequ
372b0 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20  ential and in.  
372c0 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
372d0 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  r.  This invaria
372e0 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75 73  nts arise becaus
372f0 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  e multiple overf
37300 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20  lows can.    ** 
37310 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
37320 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64 65  inserting divide
37330 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  r cells into the
37340 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75 72   parent page dur
37350 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e  ing.    ** balan
37360 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69  cing, and the di
37370 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61 63  viders are adjac
37380 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a  ent and sorted..
37390 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
373a0 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65  t( j==0 || pPage
373b0 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75  ->aiOvfl[j-1]<(u
373c0 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66  16)i ); /* Overf
373d0 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f  lows in sorted o
373e0 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  rder */.    asse
373f0 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70  rt( j==0 || i==p
37400 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
37410 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72  ]+1 );   /* Over
37420 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e  flows are sequen
37430 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  tial */.  }else{
37440 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
37450 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37460 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
37470 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
37480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37490 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
374a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
374b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
374c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
374d0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
374e0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
374f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
37500 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61     assert( &data
37510 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
37520 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c  et]==pPage->aCel
37530 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d  lIdx );.    rc =
37540 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
37550 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
37560 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
37570 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
37580 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
37590 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
375a0 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
375b0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
375c0 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
375d0 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
375e0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a  successfully */.
375f0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
37600 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
37610 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65  rt( idx >= pPage
37620 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
37630 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c  Page->nCell+2 ||
37640 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
37650 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
37660 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
37670 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
37680 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
37690 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
376a0 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
376b0 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
376c0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
376d0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
376e0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
376f0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
37700 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d      }.    pIns =
37710 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
37720 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d   + i*2;.    memm
37730 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73  ove(pIns+2, pIns
37740 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
37750 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74  l - i));.    put
37760 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29  2byte(pIns, idx)
37770 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
37780 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63  ll++;.    /* inc
37790 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20  rement the cell 
377a0 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  count */.    if(
377b0 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e   (++data[pPage->
377c0 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30  hdrOffset+4])==0
377d0 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68   ) data[pPage->h
377e0 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20  drOffset+3]++;. 
377f0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
37800 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
37810 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
37820 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
37830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37840 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
37850 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
37860 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
37870 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
37880 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
37890 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
378a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
378b0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
378c0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
378d0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
378e0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
378f0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
37900 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
37910 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
37920 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
37930 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
37940 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72  ../*.** A CellAr
37950 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
37960 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20 70  ins a cache of p
37970 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65  ointers and size
37980 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65  s for a.** conse
37990 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65 20  cutive sequence 
379a0 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69  of cells that mi
379b0 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d  ght be held on m
379c0 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a  ultiple pages..*
379d0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
379e0 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41   CellArray CellA
379f0 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c  rray;.struct Cel
37a00 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e  lArray {.  int n
37a10 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
37a20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37a30 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
37a40 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
37a50 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f  pRef;          /
37a60 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67 65  * Reference page
37a70 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
37a80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
37a90 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
37aa0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
37ab0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
37ac0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
37ad0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
37ae0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
37af0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
37b00 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69  sure the cell si
37b10 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b  zes at idx, idx+
37b20 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20  1, ..., idx+N-1 
37b30 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d  have been.** com
37b40 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
37b50 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65   void populateCe
37b60 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61  llCache(CellArra
37b70 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  y *p, int idx, i
37b80 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
37b90 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e   idx>=0 && idx+N
37ba0 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  <=p->nCell );.  
37bb0 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20  while( N>0 ){.  
37bc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
37bd0 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20  ell[idx]!=0 );. 
37be0 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c     if( p->szCell
37bf0 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [idx]==0 ){.    
37c00 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d    p->szCell[idx]
37c10 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
37c20 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
37c30 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a  ->apCell[idx]);.
37c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37c50 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
37c60 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _DB ||.         
37c70 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69       p->szCell[i
37c80 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43  dx]==p->pRef->xC
37c90 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
37ca0 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
37cb0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
37cc0 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20  x++;.    N--;.  
37cd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
37ce0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
37cf0 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66  e Nth element of
37d00 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a   the cell array.
37d10 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
37d20 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f  _NOINLINE u16 co
37d30 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65  mputeCellSize(Ce
37d40 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
37d50 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
37d60 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
37d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
37d80 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b  >szCell[N]==0 );
37d90 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20  .  p->szCell[N] 
37da0 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  = p->pRef->xCell
37db0 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
37dc0 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72  >apCell[N]);.  r
37dd0 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b  eturn p->szCell[
37de0 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  N];.}.static u16
37df0 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
37e00 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
37e10 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
37e20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
37e30 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ll );.  if( p->s
37e40 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72  zCell[N] ) retur
37e50 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a  n p->szCell[N];.
37e60 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65    return compute
37e70 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a  CellSize(p, N);.
37e80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
37e90 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
37ea0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65   pointers to nCe
37eb0 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63  ll b-tree page c
37ec0 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a  ells. The .** sz
37ed0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Cell[] array con
37ee0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
37ef0 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
37f00 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
37f10 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20  ion.** replaces 
37f20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
37f30 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67  ents of page pPg
37f40 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
37f50 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a  ts of the cell.*
37f60 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  * array..**.** S
37f70 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
37f80 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79   in apCell[] may
37f90 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
37fa0 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69  ored in pPg. Thi
37fb0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
37fc0 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c  rks around probl
37fd0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68  ems caused by th
37fe0 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63  is by making a c
37ff0 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73  opy of any .** s
38000 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  uch cells before
38010 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
38020 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a   page data..**.*
38030 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46  * The MemPage.nF
38040 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
38050 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
38060 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
38070 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
38080 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
38090 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
380a0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
380b0 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64  atic int rebuild
380c0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
380d0 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
380e0 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
380f0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
38100 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
38110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38120 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
38130 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
38140 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
38150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38160 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
38170 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
38180 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
38190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
381a0 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
381b0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
381c0 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
381d0 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
381e0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
381f0 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a   header on pPg *
38200 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
38210 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
38220 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
38230 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
38240 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e  for pPg */.  con
38250 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  st int usableSiz
38260 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
38270 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a  ableSize;.  u8 *
38280 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
38290 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d  Data[usableSize]
382a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
382b0 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d  *pCellptr = pPg-
382c0 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20  >aCellIdx;.  u8 
382d0 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
382e0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
382f0 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
38300 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20  .  u8 *pData;.. 
38310 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61   i = get2byte(&a
38320 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  Data[hdr+5]);.  
38330 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c  memcpy(&pTmp[i],
38340 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62   &aData[i], usab
38350 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20  leSize - i);..  
38360 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20  pData = pEnd;.  
38370 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
38380 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
38390 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69  pCell = apCell[i
383a0 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ];.    if( SQLIT
383b0 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61  E_WITHIN(pCell,a
383c0 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20  Data,pEnd) ){.  
383d0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
383e0 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
383f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74  ;.    }.    pDat
38400 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  a -= szCell[i];.
38410 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
38420 6c 6c 70 74 72