/ Hex Artifact Content
Login

Artifact 9d684e19f84633323de7a767da2e2b8cf51fa600:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = -1;.}../*.** 
4ef0: 54 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  The cursor passe
4f00: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
4f10: 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
4f20: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
4f30: 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ry.** when this 
4f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4f50: 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53  ed (i.e. have eS
4f60: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f70: 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ID). This.** fun
4f80: 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20  ction saves the 
4f90: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b  current cursor k
4fa0: 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20  ey in variables 
4fb0: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a  pCur->nKey and.*
4fc0: 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51  * pCur->pKey. SQ
4fd0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4fe0: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
4ff0: 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  l or an SQLite e
5000: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74  rror .** code ot
5010: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
5020: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
5030: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65  open on an intke
5040: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
5050: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a  e integer key.**
5060: 20 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20   (the rowid) is 
5070: 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e  stored in pCur->
5080: 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70  nKey and pCur->p
5090: 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20  Key is left set 
50a0: 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74  to.** NULL. If t
50b0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
50c0: 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  n on a non-intke
50d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43  y table, then pC
50e0: 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20  ur->pKey is .** 
50f0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
5100: 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  a malloced buffe
5110: 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  r pCur->nKey byt
5120: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
5130: 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65  ining .** the ke
5140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5150: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42   saveCursorKey(B
5160: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5170: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5180: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5190: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
51a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
51b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
51c0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
51d0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
51e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
51f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5200: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5210: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
5220: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
5230: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
5240: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
5250: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
5260: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
5270: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
5280: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
5290: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
52a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
52b0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
52c0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
52d0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
52e0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
52f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
5300: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
5310: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
5320: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
5330: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
5340: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
5350: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
5360: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
5370: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
5380: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
5390: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
53a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
53b0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
53c0: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
53d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
53e0: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
53f0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5400: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5430: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5460: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5470: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5480: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5490: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
54a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
54b0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
54c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
54d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
54e0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
54f0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5510: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5520: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5530: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5540: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5550: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
5560: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
5570: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
5580: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
5590: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
55a0: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
55b0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
55c0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
55d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
55f0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5600: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
5610: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5620: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5630: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5640: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
5650: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
5660: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5670: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5680: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5690: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
56a0: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
56b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
56c0: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
56d0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
5700: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
5710: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65    }..  rc = save
5720: 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b  CursorKey(pCur);
5730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65  E_OK ){.    btre
5750: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5760: 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
5770: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5780: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5790: 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  EEK;.  }..  pCur
57a0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
57b0: 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
57c0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
57d0: 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65  CF_AtLast);.  re
57e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
57f0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
5800: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
5810: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5820: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5830: 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c  (BtCursor*,Pgno,
5840: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
5850: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
5860: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
5870: 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78  sors (except pEx
5880: 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f  cept) that are o
5890: 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61  pen on.** the ta
58a0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
58b0: 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69  ge iRoot.  "Savi
58c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ng the cursor po
58d0: 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68  sition" means th
58e0: 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69  at.** the locati
58f0: 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  on in the btree 
5900: 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e  is remembered in
5910: 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
5920: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f   it can be.** mo
5930: 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ved back to the 
5940: 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20  same spot after 
5950: 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65  the btree has be
5960: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
5970: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
5980: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5990: 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65  ore cursor pExce
59a0: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
59b0: 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c  dify the.** tabl
59c0: 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  e, for example i
59d0: 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  n BtreeDelete() 
59e0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
59f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
5a00: 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
5a10: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
5a20: 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
5a30: 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75   all such .** cu
5a40: 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76  rsors should hav
5a50: 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c  e their BTCF_Mul
5a60: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
5a70: 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72   The btreeCursor
5a80: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e  ().** routine en
5a90: 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65  forces that rule
5aa0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5ab0: 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  only needs to be
5ac0: 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68   called in.** th
5ad0: 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  e uncommon case 
5ae0: 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73  when pExpect has
5af0: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
5b00: 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  le flag set..**.
5b10: 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e  ** If pExpect!=N
5b20: 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74  ULL and if no ot
5b30: 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20  her cursors are 
5b40: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d  found on the sam
5b50: 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20  e root-page,.** 
5b60: 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75  then the BTCF_Mu
5b70: 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70  ltiple flag on p
5b80: 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65  Expect is cleare
5b90: 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74  d, to avoid anot
5ba0: 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73  her.** pointless
5bb0: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
5bc0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  utine..**.** Imp
5bd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
5be0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
5bf0: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
5c00: 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73   see if any curs
5c10: 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62  ors.** need to b
5c20: 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c  e saved.  It cal
5c30: 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75  ls out to saveCu
5c40: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e  rsorsOnList() in
5c50: 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a   the (unusual).*
5c60: 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72  * event that cur
5c70: 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64  sors are in need
5c80: 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e   to being saved.
5c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5ca0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
5cb0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5cc0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
5cd0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
5ce0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
5cf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5d00: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
5d10: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
5d20: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
5d30: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
5d40: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
5d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5d70: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
5d80: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
5d90: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
5da0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
5db0: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
5dc0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5dd0: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
5de0: 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63  ept);.  if( pExc
5df0: 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63  ept ) pExcept->c
5e00: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
5e10: 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74  _Multiple;.  ret
5e20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5e30: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
5e40: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
5e50: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
5e60: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
5e70: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
5e80: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
5e90: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
5ea0: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
5eb0: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
5ec0: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
5ed0: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
5ee0: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
5ef0: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
5f00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5f10: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
5f20: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
5f30: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
5f40: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
5f50: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
5f60: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5f70: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5f80: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
5f90: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
5fa0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
5fb0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
5fc0: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
5fd0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
5fe0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
5ff0: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
6000: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
6010: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
6020: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6030: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
6040: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
6050: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
6060: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6070: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6080: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6090: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
60a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
60b0: 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
60c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
60d0: 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
60e0: 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72  int rc = saveCur
60f0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
6100: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
6110: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
6120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6150: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50   testcase( p->iP
6160: 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  age>0 );.       
6170: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6180: 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
6190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
61a0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
61b0: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
61c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
61d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
61e0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
61f0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
6200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6210: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
6220: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6230: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6240: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6250: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
6260: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6270: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6280: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
6290: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62a0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
62b0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
62c0: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
62d0: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
62e0: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
62f0: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
6300: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
6310: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
6320: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
6330: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
6340: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
6350: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
6360: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
6370: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
6380: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
6390: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
63a0: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
63b0: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
63c0: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
63d0: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
63e0: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
63f0: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
6400: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
6410: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
6420: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
6430: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
6440: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
6450: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
6460: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
6470: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
6480: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
6490: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
64a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
64b0: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
64c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
64f0: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
6500: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
6510: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
6520: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
6530: 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20  ar aSpace[200]; 
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
6550: 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
6560: 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
6570: 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72  malloc */.  char
6580: 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
6590: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
65a0: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
65b0: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
65c0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
65d0: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
65e0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
65f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6600: 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69  Info, aSpace, si
6610: 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70  zeof(aSpace), &p
6620: 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Free.    );.    
6630: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
6640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6650: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
6660: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
6670: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
6680: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
6690: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
66a0: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
66b0: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
66c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
66d0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
66e0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
66f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6700: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6710: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6720: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6740: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6750: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6760: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6770: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
6780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
6790: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
67a0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
67b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
67c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
67d0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
67e0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
67f0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
6800: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6810: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6820: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6830: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6840: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6850: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6860: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6870: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6880: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6890: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
68a0: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
68b0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
68c0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
68d0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
68e0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
68f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6910: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6920: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6930: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6940: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6950: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6960: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6970: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
6980: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6990: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
69a0: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
69b0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
69c0: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
69d0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
69e0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
69f0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6a00: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
6a10: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
6a20: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
6a30: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
6a40: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
6a50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6a60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6a70: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
6a80: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
6a90: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
6aa0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6ab0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
6ac0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6ad0: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
6ae0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
6af0: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
6b00: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
6b10: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
6b20: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6b30: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
6b40: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6b50: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
6b60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6b70: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
6b80: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6b90: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
6ba0: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6bb0: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
6bc0: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
6bd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6be0: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
6bf0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
6c00: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
6c10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
6c20: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6c30: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
6c40: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
6c50: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
6c60: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
6c70: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
6c80: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
6c90: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
6ca0: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
6cb0: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
6cc0: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
6cd0: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
6ce0: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
6cf0: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
6d00: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
6d10: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
6d20: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
6d30: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6d40: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
6d50: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
6d60: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
6d70: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
6d80: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
6d90: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
6da0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
6db0: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
6dc0: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
6dd0: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
6de0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6df0: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
6e00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
6e10: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
6e20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6e30: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
6e40: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6e50: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
6e60: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
6e70: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
6e80: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
6e90: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
6ea0: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
6eb0: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
6ec0: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
6ed0: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
6ee0: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
6ef0: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
6f00: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
6f10: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
6f20: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
6f30: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
6f40: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
6f50: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
6f60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
6f70: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
6f80: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
6f90: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
6fa0: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
6fb0: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
6fc0: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
6fd0: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
6fe0: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
6ff0: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
7000: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
7010: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
7020: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
7030: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
7040: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
7050: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
7060: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
7070: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
7080: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
7090: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
70a0: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
70b0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
70c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
70d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
70e0: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
70f0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7100: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7110: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
7120: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7130: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
7140: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
7150: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7160: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7170: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
7180: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7190: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
71a0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
71b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
71c0: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
71d0: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
71e0: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
71f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
7210: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7220: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7230: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
7240: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
7250: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
7260: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
7270: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
7280: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
7290: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
72a0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
72b0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
72c0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
72d0: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
72e0: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
72f0: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
7300: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
7310: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
7320: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
7330: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
7340: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
7350: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
7360: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
7370: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
7380: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
7390: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
73a0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
73b0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
73c0: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
73d0: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
73e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
73f0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7400: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
7410: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
7420: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
7430: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
7440: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
7450: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
7460: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7470: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
7480: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
7490: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
74a0: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
74b0: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
74c0: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
74d0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
74e0: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
74f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
7500: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7510: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
7520: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
7530: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
7540: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
7550: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
7560: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
7570: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
7580: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
7590: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
75a0: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
75b0: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
75c0: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
75d0: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
75e0: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
75f0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
7600: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
7610: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
7620: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
7630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
7640: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
7650: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
7660: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
7670: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
7680: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7690: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
76a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
76b0: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
76c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
76d0: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
76e0: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
76f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7700: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7710: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
7720: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
7730: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
7740: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7750: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7760: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
7770: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7780: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7790: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
77a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
77b0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
77c0: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
77d0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
77e0: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
77f0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7800: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7810: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
7820: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
7830: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
7840: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
7850: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
7860: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
7870: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7880: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7890: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
78a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
78b0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
78c0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
78d0: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
78e0: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
78f0: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7900: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7920: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7930: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7940: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7950: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7960: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7970: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7980: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7990: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
79a0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
79b0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
79c0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
79d0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
79e0: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
79f0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7a00: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7a10: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7a20: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7a30: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7a40: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7a50: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7a60: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7a70: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7a80: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7a90: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7aa0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7ab0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7ac0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7ad0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7ae0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7af0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7b00: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7b10: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7b20: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
7b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
7b40: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
7b50: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7b60: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7b70: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7b80: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7b90: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7ba0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7bb0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7bc0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7bd0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7be0: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7bf0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7c00: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7c10: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7c20: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
7c30: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
7c40: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
7c50: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
7c60: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
7c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7c80: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7c90: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7ca0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7cb0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7cc0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7cd0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7ce0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7cf0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
7d00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
7d10: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
7d20: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
7d30: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
7d40: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
7d50: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7d60: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
7d70: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
7d80: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7d90: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7da0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7db0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7dc0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7dd0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7de0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7df0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7e00: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7e10: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
7e20: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
7e30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7e40: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e50: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e60: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7e70: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7e80: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7e90: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7ea0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7eb0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7ec0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ee0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7ef0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7f00: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7f10: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7f20: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
7f30: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
7f40: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
7f50: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
7f60: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
7f70: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7f80: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7f90: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7fa0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7fb0: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7fc0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7fd0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7fe0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7ff0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
8000: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
8010: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8020: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8030: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8040: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8050: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8060: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
8070: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8080: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
8090: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
80a0: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
80b0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
80c0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
80d0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
80e0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
80f0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
8100: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
8110: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8120: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8130: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8140: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8150: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8160: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
8170: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
8180: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
8190: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
81a0: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
81b0: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
81c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
81d0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
81e0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
81f0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
8200: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
8210: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8220: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8230: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8240: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8250: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8260: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8270: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
8280: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8290: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
82a0: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
82b0: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
82c0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
82d0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
82e0: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
82f0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
8300: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
8310: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8320: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8330: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8340: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8350: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8360: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
8370: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
8380: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
8390: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
83a0: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
83b0: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
83c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
83d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
83e0: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
83f0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
8400: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
8410: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8420: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8430: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8440: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8450: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8460: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8470: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8480: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8490: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
84a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
84b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
84c0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
84d0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
84e0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
84f0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
8500: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
8510: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8520: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8530: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8540: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8550: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8560: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
8570: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
8580: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8590: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
85a0: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
85b0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
85c0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
85d0: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
85e0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
85f0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
8600: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
8610: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8620: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8630: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8640: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8650: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8660: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8670: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8680: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8690: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
86a0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
86b0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
86c0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
86d0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
86e0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
86f0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
8700: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
8710: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8720: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8730: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8740: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8750: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8760: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8770: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8780: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8790: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
87a0: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
87b0: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
87c0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
87d0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
87e0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
87f0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8800: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8810: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8820: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8830: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8840: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8850: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8860: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8870: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8880: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  }.  pInfo->iOver
8890: 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49  flow = (u16)(&pI
88a0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
88b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
88c0: 43 65 6c 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  Cell);.  pInfo->
88d0: 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69  nSize = pInfo->i
88e0: 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a  Overflow + 4;.}.
88f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8900: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
8910: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8920: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
8930: 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a  .xParseCell().**
8940: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50   method..**.** P
8950: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
8960: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
8970: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
8980: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
8990: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
89a0: 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d  llPtr()        =
89b0: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
89c0: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  leaf nodes.** bt
89d0: 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61  reeParseCellNoPa
89e0: 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61  yload()  =>   ta
89f0: 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e  ble btree intern
8a00: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  al nodes.** btre
8a10: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8a20: 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65  ex()   =>   inde
8a30: 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a  x btree nodes.**
8a40: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73  .** There is als
8a50: 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63  o a wrapper func
8a60: 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43  tion btreeParseC
8a70: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
8a80: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50   for.** all MemP
8a90: 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68  age types and th
8aa0: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
8ab0: 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20  e cell by index 
8ac0: 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62  rather than.** b
8ad0: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  y pointer..*/.st
8ae0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
8af0: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
8b00: 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20  load(.  MemPage 
8b10: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8b20: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8b30: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8b40: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8b60: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8b70: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8b80: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8b90: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8ba0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8bb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
8bc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8bd0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8be0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
8bf0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29  pPage->leaf==0 )
8c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8c10: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a  e->noPayload );.
8c20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8c30: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34  >childPtrSize==4
8c40: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
8c50: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
8c60: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67  D_PARAMETER(pPag
8c70: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  e);.#endif.  pIn
8c80: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20  fo->nSize = 4 + 
8c90: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
8ca0: 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [4], (u64*)&pInf
8cb0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66  o->nKey);.  pInf
8cc0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b  o->nPayload = 0;
8cd0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  .  pInfo->nLocal
8ce0: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69   = 0;.  pInfo->i
8cf0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8d00: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
8d10: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
8d20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
8d30: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
8d40: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8d50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8d60: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8d70: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8d80: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8d90: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8da0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8db0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
8dc0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
8dd0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
8de0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
8df0: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
8e00: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
8e10: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
8e20: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
8e30: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
8e40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
8e50: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
8e60: 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b  load */.  u64 iK
8e70: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
8e80: 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b    /* Extracted K
8e90: 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61  ey value */..  a
8ea0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8eb0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8ec0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8ed0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8ee0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
8ef0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
8f00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
8f10: 6e 74 4b 65 79 4c 65 61 66 20 7c 7c 20 70 50 61  ntKeyLeaf || pPa
8f20: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b  ge->noPayload );
8f30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8f40: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29  ->noPayload==0 )
8f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8f60: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
8f70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8f80: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
8f90: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
8fa0: 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Cell;..  /* The 
8fb0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
8fc0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
8fd0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
8fe0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
8ff0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
9000: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20  Payload);.  **. 
9010: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9020: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9030: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9040: 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  ..  */.  nPayloa
9050: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
9060: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
9070: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9080: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
9090: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
90a0: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
90b0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
90c0: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
90d0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
90e0: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49      }while( (*pI
90f0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
9100: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
9110: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a    pIter++;..  /*
9120: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9130: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
9140: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
9150: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
9160: 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72   getVarint(pIter
9170: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
9180: 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  nKey);.  **.  **
9190: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
91a0: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
91b0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
91c0: 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49   */.  iKey = *pI
91d0: 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e  ter;.  if( iKey>
91e0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
91f0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37  *pEnd = &pIter[7
9200: 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30  ];.    iKey &= 0
9210: 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31  x7f;.    while(1
9220: 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  ){.      iKey = 
9230: 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b  (iKey<<7) | (*++
9240: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9250: 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72       if( (*pIter
9260: 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a  )<0x80 ) break;.
9270: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e        if( pIter>
9280: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
9290: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38   iKey = (iKey<<8
92a0: 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20  ) | *++pIter;.  
92b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
92d0: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e   pIter++;..  pIn
92e0: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34  fo->nKey = *(i64
92f0: 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f  *)&iKey;.  pInfo
9300: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
9310: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9320: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
9330: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
9340: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
9350: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
9360: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9370: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9380: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
9390: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
93a0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
93b0: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
93c0: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
93d0: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
93e0: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
93f0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9400: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
9410: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
9420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
9430: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
9440: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
9450: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
9460: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
9470: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
9480: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
9490: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
94a0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
94b0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
94c0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
94d0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
94e0: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
94f0: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9500: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9510: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
9520: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
9530: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
9540: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9550: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9560: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9570: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9580: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9590: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
95a0: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
95b0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
95c0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
95d0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
95e0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9600: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9610: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
9620: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
9630: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9640: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
9650: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
9660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9670: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9680: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9690: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96a0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
96b0: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
96c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
96d0: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
96e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96f0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29  ->noPayload==0 )
9700: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
9710: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
9720: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
9730: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
9740: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
9750: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9760: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9770: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
9780: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
9790: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
97a0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
97b0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
97c0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
97d0: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
97e0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
97f0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
9800: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
9810: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9820: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
9830: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
9840: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
9850: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9860: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9870: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
9880: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
9890: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
98a0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
98b0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
98c0: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
98d0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
98e0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
98f0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
9900: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
9910: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
9920: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
9930: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
9940: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
9950: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
9960: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
9970: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9980: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
9990: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
99a0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
99b0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
99c0: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66  ayload;.    pInf
99d0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30  o->iOverflow = 0
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 28 0a 20 20 4d 65 6d  ParseCell(.  Mem
9a50: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9a60: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9a70: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9a80: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c   */.  int iCell,
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9aa0: 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e   The cell index.
9ab0: 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20    First cell is 
9ac0: 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  0 */.  CellInfo 
9ad0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9ae0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
9af0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
9b00: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
9b10: 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ll(pPage, findCe
9b20: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
9b30: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
9b40: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9b50: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
9b60: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
9b70: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65   the MemPage.xCe
9b80: 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64  llSize.** method
9b90: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ..**.** Compute 
9ba0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
9bb0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
9bc0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
9bd0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
9be0: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
9bf0: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
9c00: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
9c10: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
9c20: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
9c30: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
9c40: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
9c50: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
9c60: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
9c70: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
9c80: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c  inter..**.** cel
9c90: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
9ca0: 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c  d()    =>   tabl
9cb0: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
9cc0: 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  .** cellSizePtr(
9cd0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e  )             =>
9ce0: 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64     all index nod
9cf0: 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20  es & table leaf 
9d00: 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  nodes.*/.static 
9d10: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
9d20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9d30: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
9d40: 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20   *pIter = pCell 
9d50: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
9d60: 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f  rSize; /* For lo
9d70: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
9d80: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
9d90: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d          /* End m
9dc0: 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74  ark for a varint
9dd0: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b   */.  u32 nSize;
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e00: 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20  * Size value to 
9e10: 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65  return */..#ifde
9e20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9e30: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
9e40: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
9e50: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
9e60: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
9e70: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
9e80: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
9e90: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
9ea0: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
9eb0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
9ec0: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
9ed0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
9ee0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
9ef0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
9f00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
9f10: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
9f20: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
9f30: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
9f40: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
9f50: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
9f60: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
9f70: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
9f80: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  fo);.#endif..  a
9f90: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f  ssert( pPage->no
9fa0: 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20  Payload==0 );.  
9fb0: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
9fc0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
9fd0: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
9fe0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9ff0: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
a000: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
a010: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
a020: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a030: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a040: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
a050: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a060: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
a070: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
a080: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
a090: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
a0a0: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
a0b0: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
a0c0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
a0d0: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
a0e0: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
a0f0: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
a100: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
a110: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
a120: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a130: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
a140: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
a150: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
a160: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a170: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a180: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
a190: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a1a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a1b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
a1c0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a1d0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a1e0: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
a1f0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
a200: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
a210: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
a220: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
a230: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
a240: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
a250: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
a260: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
a270: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
a280: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
a290: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
a2a0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
a2b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a2c0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a2d0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
a2e0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a2f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a300: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a310: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
a320: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
a330: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
a340: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
a350: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
a360: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
a370: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
a380: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
a390: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
a3a0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
a3b0: 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  ze;.}.static u16
a3c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a3d0: 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70  yload(MemPage *p
a3e0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a3f0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a400: 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f  pCell + 4; /* Fo
a410: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a420: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a430: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a450: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a460: 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
a470: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a480: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a490: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a4a0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a4b0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a4c0: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a4d0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a4e0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a4f0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a500: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a510: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a520: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a530: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a540: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a550: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a560: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a570: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a580: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a590: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a5a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a5b0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a5c0: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a5d0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
a5e0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
a5f0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
a600: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a610: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
a620: 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39  pEnd = pIter + 9
a630: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74  ;.  while( (*pIt
a640: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a650: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73  ter<pEnd );.  as
a660: 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e  sert( debuginfo.
a670: 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74  nSize==(u16)(pIt
a680: 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43  er - pCell) || C
a690: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
a6a0: 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65  eturn (u16)(pIte
a6b0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a  r - pCell);.}...
a6c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a6d0: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
a6e0: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
a6f0: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
a700: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
a710: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
a720: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
a730: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
a740: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
a750: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
a760: 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  n pPage->xCellSi
a770: 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ze(pPage, findCe
a780: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
a790: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
a7a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a7b0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
a7c0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
a7d0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
a7e0: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
a7f0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
a800: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
a810: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
a820: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
a830: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
a840: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
a850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a860: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
a870: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
a880: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
a890: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
a8a0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
a8b0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
a8c0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
a8d0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
a8e0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a8f0: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
a900: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
a910: 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ow ){.    Pgno o
a920: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
a930: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
a940: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d  flow]);.    ptrm
a950: 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
a960: 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  , ovfl, PTRMAP_O
a970: 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
a980: 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d  >pgno, pRC);.  }
a990: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
a9a0: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
a9b0: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
a9c0: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
a9d0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
a9e0: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
a9f0: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
aa00: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
aa10: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
aa20: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
aa30: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
aa40: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
aa50: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
aa60: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
aa70: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a  tent area..**.**
aa80: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
aa90: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
aaa0: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
aab0: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
aac0: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
aad0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
aae0: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
aaf0: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
ab00: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
ab10: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
ab20: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
ab30: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
ab40: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
ab50: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
ab60: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
ab70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
ab80: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
ab90: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
aba0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
abb0: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
abe0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ac10: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
ac20: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac40: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
ac50: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
ac60: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
ac70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
ac80: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
ac90: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
aca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
acb0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
acc0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
acd0: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
ace0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
acf0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
ad00: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ad10: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
ad20: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
ad30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
ad40: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
ad50: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
ad60: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
ad70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ad80: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
ad90: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
ada0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
adb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
adc0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
add0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
ade0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
adf0: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
ae00: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
ae10: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
ae20: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
ae30: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
ae40: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
ae50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ae60: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
ae70: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
ae80: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
ae90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
aea0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
aeb0: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
aec0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
aed0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
aee0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
aef0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af00: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
af10: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
af20: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
af30: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
af40: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
af50: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
af60: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
af70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
af80: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
af90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
afa0: 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61   = 0;.  src = da
afb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
afc0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
afd0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
afe0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
aff0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
b000: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
b010: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
b020: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
b030: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
b040: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
b050: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b060: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
b070: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
b080: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
b090: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
b0a0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
b0b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
b0c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
b0d0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
b0e0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
b0f0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
b100: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
b110: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
b120: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
b130: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
b140: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
b150: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b160: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b170: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b180: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
b190: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
b1a0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b1b0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
b1c0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
b1d0: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
b1e0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
b1f0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
b200: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
b210: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
b220: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b240: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
b250: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
b260: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
b270: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
b280: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
b290: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
b2a0: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
b2b0: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
b2c0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
b2d0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
b2e0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
b2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b300: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b310: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
b320: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
b330: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
b340: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
b350: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
b360: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
b370: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b380: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
b390: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
b3a0: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
b3b0: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
b3c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
b3d0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
b3e0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
b3f0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
b400: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
b410: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
b420: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
b430: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
b440: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
b450: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
b460: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
b470: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
b480: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
b490: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
b4a0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
b4b0: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
b4c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
b4d0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
b4e0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
b4f0: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
b500: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
b510: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b520: 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  2] = 0;.  data[h
b530: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+7] = 0;.  mem
b540: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
b550: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
b560: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
b570: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b580: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b590: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b5a0: 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c  .  if( cbrk-iCel
b5b0: 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e  lFirst!=pPage->n
b5c0: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
b5d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b5e0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
b5f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b600: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
b610: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
b620: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
b630: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
b640: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
b650: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
b660: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
b670: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
b680: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
b690: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
b6a0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
b6b0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
b6c0: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
b6d0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
b6e0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
b6f0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
b700: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
b710: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
b720: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
b730: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
b740: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
b750: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
b760: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
b770: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
b780: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
b790: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
b7a0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
b7b0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
b7c0: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
b7d0: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
b7e0: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
b7f0: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
b800: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
b810: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
b820: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
b830: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
b840: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
b850: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
b860: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
b870: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
b880: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
b890: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
b8a0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
b8b0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
b8c0: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
b8d0: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
b8e0: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
b8f0: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
b900: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
b910: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
b920: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
b930: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
b940: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
b950: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
b960: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
b970: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
b980: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
b990: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
b9a0: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
b9b0: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
b9c0: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
b9d0: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
b9e0: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
b9f0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
ba00: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
ba10: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
ba20: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
ba30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ba40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
ba50: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
ba60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37  IDENCE-OF: R-227
ba70: 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69  10-53328 The thi
ba80: 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79  rd and fourth by
ba90: 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20  tes of each.    
baa0: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72  ** freeblock for
bab0: 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  m a big-endian i
bac0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
bad0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bae0: 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a  freeblock.    **
baf0: 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75   in bytes, inclu
bb00: 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20  ding the 4-byte 
bb10: 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73  header. */.    s
bb20: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
bb30: 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  aData[pc+2]);.  
bb40: 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20    if( (x = size 
bb50: 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20  - nByte)>=0 ){. 
bb60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
bb70: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==4 );.      tes
bb80: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
bb90: 20 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50       if( pc < pP
bba0: 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  g->cellOffset+2*
bbb0: 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69  pPg->nCell || si
bbc0: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
bbd0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ze ){.        *p
bbe0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
bbf0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bc00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
bc10: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20    }else if( x<4 
bc20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
bc30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
bc40: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
bc50: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
bc60: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
bc70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
bc80: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
bc90: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
bca0: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
bcb0: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
bcc0: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
bcd0: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
bce0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
bcf0: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
bd00: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
bd10: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
bd20: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
bd30: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
bd40: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
bd50: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
bd60: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
bd70: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
bd80: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
bd90: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
bda0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
bdb0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
bdc0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
bdd0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
bde0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
bdf0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
be00: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
be10: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
be20: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
be30: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
be40: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
be50: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
be60: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
be70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
be80: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
be90: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
bea0: 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28  [pc]);.  }while(
beb0: 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e   pc );..  return
bec0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
bed0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
bee0: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
bef0: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
bf00: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
bf10: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
bf20: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
bf30: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
bf40: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
bf50: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
bf60: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
bf70: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
bf80: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
bf90: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
bfa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
bfb0: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
bfc0: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
bfd0: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
bfe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
bff0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
c000: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
c010: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
c020: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
c030: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
c040: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
c050: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
c060: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
c070: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
c080: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
c090: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
c0a0: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
c0b0: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
c0c0: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
c0d0: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
c0e0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
c0f0: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
c100: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
c110: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
c120: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
c130: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
c140: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
c150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
c160: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
c170: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
c180: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
c190: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
c1a0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c1b0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
c1c0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
c1d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
c1e0: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
c1f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
c200: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
c210: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c220: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
c230: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
c260: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
c270: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rea */.  int rc 
c280: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2a0: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
c2b0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61  code */.  int ga
c2c0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
c2d0: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
c2e0: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
c2f0: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
c300: 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73  ntent */.  .  as
c310: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c320: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c330: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c340: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c350: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
c360: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c370: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
c380: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
c390: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
c3a0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
c3b0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
c3c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c3d0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
c3e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c3f0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
c400: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
c410: 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d  e < (int)(pPage-
c420: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
c430: 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  -8) );..  assert
c440: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
c450: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
c460: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
c470: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
c480: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
c490: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
c4a0: 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35   assert( gap<=65
c4b0: 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  536 );.  /* EVID
c4c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36  ENCE-OF: R-29356
c4d0: 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61  -02391 If the da
c4e0: 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35  tabase uses a 65
c4f0: 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69  536-byte page si
c500: 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ze.  ** and the 
c510: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69  reserved space i
c520: 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61  s zero (the usua
c530: 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65  l value for rese
c540: 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a  rved space).  **
c550: 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63   then the cell c
c560: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66  ontent offset of
c570: 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
c580: 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36  ants to be 65536
c590: 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
c5a0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20  that integer is 
c5b0: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
c5c0: 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79  stored in a 2-by
c5d0: 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a  te unsigned.  **
c5e0: 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76   integer, so a v
c5f0: 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65  alue of 0 is use
c600: 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  d in its place. 
c610: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
c620: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c630: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
c640: 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  <=(int)pPage->pB
c650: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
c660: 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67   /* Prevent by g
c670: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20  etAndInitPage() 
c680: 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  */.  if( gap>top
c690: 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d   ){.    if( top=
c6a0: 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74  =0 && pPage->pBt
c6b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35  ->usableSize==65
c6c0: 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  536 ){.      top
c6d0: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
c6e0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
c6f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c700: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
c710: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c720: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
c730: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
c740: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
c750: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
c760: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
c770: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
c780: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
c790: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
c7a0: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
c7b0: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
c7c0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
c7d0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
c7e0: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
c7f0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
c800: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
c810: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
c820: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
c830: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
c840: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
c850: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
c860: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
c870: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
c880: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
c890: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
c8a0: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
c8b0: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
c8c0: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
c8d0: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
c8e0: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
c8f0: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
c900: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
c910: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
c920: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c930: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
c940: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
c950: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
c960: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
c970: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
c980: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
c990: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
c9a0: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
c9b0: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
c9c0: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
c9d0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
c9e0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
c9f0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
ca00: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
ca10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ca20: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
ca30: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
ca40: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
ca50: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
ca60: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ca70: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
ca80: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
ca90: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
caa0: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
cab0: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
cac0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
cad0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
cae0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
caf0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
cb00: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
cb10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
cb20: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
cb30: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
cb40: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
cb50: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
cb60: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
cb70: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
cb80: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
cb90: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
cba0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
cbb0: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
cbc0: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
cbd0: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
cbe0: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
cbf0: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
cc00: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
cc10: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
cc20: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
cc30: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
cc40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
cc50: 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70  +nByte <= (int)p
cc60: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
cc70: 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78  eSize );.  *pIdx
cc80: 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e   = top;.  return
cc90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cca0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65  *.** Return a se
ccb0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61  ction of the pPa
ccc0: 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65  ge->aData to the
ccd0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68   freelist..** Th
cce0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
ccf0: 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f  the new free blo
cd00: 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61  ck is pPage->aDa
cd10: 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e  ta[iStart].** an
cd20: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
cd30: 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65  e block is iSize
cd40: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64   bytes..**.** Ad
cd50: 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b  jacent freeblock
cd60: 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e  s are coalesced.
cd70: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
cd80: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
cd90: 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20   freeblock list 
cda0: 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62  was checked by b
cdb0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a  treeInitPage(),.
cdc0: 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  ** that routine 
cdd0: 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20  will not detect 
cde0: 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20  overlap between 
cdf0: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
ce00: 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65  cks.  Nor.** doe
ce10: 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c  s it detect cell
ce20: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20  s or freeblocks 
ce30: 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e  that encrouch in
ce40: 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64 20  to the reserved 
ce50: 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  bytes.** at the 
ce60: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ce70: 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e    So do addition
ce80: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68  al corruption ch
ce90: 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73  ecks inside this
cea0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  .** routine and 
ceb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
cec0: 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f  RRUPT if any pro
ced0: 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e  blems are found.
cee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
cef0: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
cf00: 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53 74   *pPage, u16 iSt
cf10: 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b  art, u16 iSize){
cf20: 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20 20  .  u16 iPtr;    
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
cf50: 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65  ess of ptr to ne
cf60: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
cf70: 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20    u16 iFreeBlk; 
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
cfa0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  ss of the next f
cfb0: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38  reeblock */.  u8
cfc0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64      /* Page head
cff0: 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31  er size.  0 or 1
d000: 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67  00 */.  u8 nFrag
d010: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d030: 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72   Reduction in fr
d040: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  agmentation */. 
d050: 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d   u16 iOrigSize =
d060: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
d070: 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
d080: 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a  al value of iSiz
d090: 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74  e */.  u32 iLast
d0a0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
d0b0: 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20  sableSize-4; /* 
d0c0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
d0d0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
d0e0: 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  t */.  u32 iEnd 
d0f0: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
d100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d110: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
d120: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
d130: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d140: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
d150: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
d160: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
d170: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d180: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
d190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d1a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d1b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d1c0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
d1d0: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
d1e0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
d1f0: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
d200: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
d210: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
d220: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
d230: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d240: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
d250: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d260: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
d270: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
d280: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
d290: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
d2a0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
d2b0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69  ssert( iStart<=i
d2c0: 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76  Last );..  /* Ov
d2d0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
d2e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
d2f0: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
d300: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
d310: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
d320: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50  bled */.  if( pP
d330: 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  age->pBt->btsFla
d340: 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
d350: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65  DELETE ){.    me
d360: 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72  mset(&data[iStar
d370: 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20  t], 0, iSize);. 
d380: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73   }..  /* The lis
d390: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
d3a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
d3b0: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
d3c0: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
d3d0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
d3e0: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
d3f0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
d400: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
d410: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
d420: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
d430: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
d440: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
d450: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
d460: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
d470: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
d480: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
d490: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
d4a0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
d4b0: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
d4c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d4d0: 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69  a[iPtr]))>0 && i
d4e0: 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29  FreeBlk<iStart )
d4f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
d500: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65  eBlk<iPtr+4 ) re
d510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d520: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d530: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
d540: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d550: 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20  FreeBlk>iLast ) 
d560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d570: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d580: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
d590: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
d5a0: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
d5b0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
d5c0: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
d5d0: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
d5e0: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
d5f0: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
d600: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
d610: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
d620: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
d630: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
d640: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
d650: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
d660: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
d670: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
d680: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
d690: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
d6a0: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
d6b0: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
d6c0: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
d6d0: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
d6e0: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
d6f0: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
d700: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d710: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e  _BKPT;.      iEn
d720: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
d730: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
d740: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
d750: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
d760: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d770: 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ize ) return SQL
d780: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d790: 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  ;.      iSize = 
d7a0: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
d7b0: 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
d7c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d7d0: 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
d7e0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
d7f0: 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
d800: 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
d810: 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
d820: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
d830: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
d840: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
d850: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
d860: 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
d870: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
d880: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
d890: 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
d8a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
d8b0: 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
d8c0: 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
d8d0: 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
d8e0: 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
d8f0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
d900: 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
d910: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
d920: 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
d930: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d940: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e  _BKPT;.        n
d950: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
d960: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
d970: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
d980: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
d990: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
d9a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d9b0: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
d9c0: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
d9d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d9e0: 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  PT;.    data[hdr
d9f0: 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20  +7] -= nFrag;.  
da00: 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d  }.  if( iStart==
da10: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
da20: 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a  dr+5]) ){.    /*
da30: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
da40: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
da50: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
da60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
da70: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
da80: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
da90: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
daa0: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
dab0: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
dac0: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
dad0: 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68  .    if( iPtr!=h
dae0: 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51  dr+1 ) return SQ
daf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
db00: 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  T;.    put2byte(
db10: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46  &data[hdr+1], iF
db20: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
db30: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
db40: 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c  5], iEnd);.  }el
db50: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  se{.    /* Inser
db60: 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c  t the new freebl
db70: 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65  ock into the fre
db80: 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74  elist */.    put
db90: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
dba0: 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  ], iStart);.    
dbb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
dbc0: 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b  Start], iFreeBlk
dbd0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
dbe0: 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c  &data[iStart+2],
dbf0: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
dc00: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69  Page->nFree += i
dc10: 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75  OrigSize;.  retu
dc20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dc30: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
dc40: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
dc50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
dc60: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
dc70: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
dc80: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
dc90: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
dca0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
dcb0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
dcc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
dcd0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
dce0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
dcf0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
dd00: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
dd10: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
dd20: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
dd30: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
dd40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
dd50: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
dd60: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
dd70: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
dd80: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
dd90: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
dda0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
ddb0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
ddc0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
ddd0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
dde0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
ddf0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
de00: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
de10: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
de20: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
de30: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
de40: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
de50: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
de60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
de70: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
de80: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
de90: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
dea0: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
deb0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
dec0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
ded0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
dee0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
def0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
df00: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
df10: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  ;.  pPage->xCell
df20: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
df30: 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  tr;.  pBt = pPag
df40: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
df50: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
df60: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
df70: 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  EY) ){.    /* EV
df80: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36  IDENCE-OF: R-036
df90: 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65  40-13415 A value
dfa0: 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20   of 5 means the 
dfb0: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
dfc0: 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ior.    ** table
dfd0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
dfe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
dff0: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e000: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
e010: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e020: 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41   R-20501-61796 A
e030: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61   value of 13 mea
e040: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
e050: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62   leaf.    ** tab
e060: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
e070: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e080: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
e090: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
e0a0: 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
e0b0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
e0c0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
e0d0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eaf ){.      pPa
e0e0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
e0f0: 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   1;.      pPage-
e100: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  >noPayload = 0;.
e110: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
e120: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e130: 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20  arseCellPtr;.   
e140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
e150: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e160: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
e170: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b  ->noPayload = 1;
e180: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43  .      pPage->xC
e190: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
e1a0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  zePtrNoPayload;.
e1b0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
e1c0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e1d0: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
e1e0: 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  load;.    }.    
e1f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
e200: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
e210: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
e220: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
e230: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
e240: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
e250: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
e260: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e270: 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61  27225-53936 A va
e280: 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74  lue of 2 means t
e290: 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e  he page is an in
e2a0: 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  terior.    ** in
e2b0: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
e2c0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e2d0: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
e2e0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
e2f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31  ENCE-OF: R-16571
e300: 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f  -11615 A value o
e310: 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70  f 10 means the p
e320: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
e330: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
e340: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e350: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
e360: 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
e370: 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
e380: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
e390: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
e3a0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
e3b0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30  e->noPayload = 0
e3c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
e3d0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e3e0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
e3f0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
e400: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e410: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
e420: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e430: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
e440: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
e450: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
e460: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
e470: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
e480: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
e490: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
e4a0: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
e4b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e4c0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
e4d0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
e4e0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
e4f0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
e500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e510: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
e520: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
e530: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
e540: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
e550: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e560: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e570: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
e580: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
e590: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
e5a0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
e5b0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
e5c0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
e5d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
e5e0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
e5f0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
e600: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
e610: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
e620: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
e630: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
e640: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
e650: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
e660: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e670: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e680: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
e690: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
e6a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
e6b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e6c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
e6d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e6e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e6f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e700: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e710: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
e720: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
e730: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
e740: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e750: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
e760: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e770: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e780: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e790: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
e7a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e7b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e7c0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
e7d0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e7e0: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
e7f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e800: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
e810: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
e820: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
e830: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
e840: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
e850: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
e860: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
e870: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
e880: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
e890: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
e8a0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
e8b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
e8c0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
e8d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
e8e0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
e8f0: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
e900: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
e910: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
e920: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
e930: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
e940: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
e950: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
e960: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
e970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e980: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
e990: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
e9a0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
e9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
e9c0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
e9d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
e9e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
e9f0: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
ea00: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
ea10: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
ea20: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
ea30: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ea40: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
ea50: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ea60: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
ea70: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
ea80: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
ea90: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
eaa0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
eab0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
eac0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ead0: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
eae0: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
eaf0: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
eb00: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
eb10: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
eb20: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
eb30: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
eb40: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eb60: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
eb70: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
eb80: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
eb90: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
eba0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ebb0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ebc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ebd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ebe0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ebf0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ec00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ec10: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ec20: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
ec30: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
ec40: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
ec50: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
ec60: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
ec70: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
ec80: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
ec90: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
eca0: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
ecb0: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ecc0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ecd0: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
ece0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
ecf0: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
ed00: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
ed10: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
ed20: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
ed30: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
ed40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ed50: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
ed60: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
ed70: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
ed80: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ed90: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
eda0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
edb0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
edc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
edd0: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
ede0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
edf0: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
ee00: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
ee10: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
ee20: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
ee30: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
ee40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ee50: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
ee60: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ee70: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ee80: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
ee90: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
eea0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
eeb0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
eec0: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
eed0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
eee0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
eef0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
ef00: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
ef10: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
ef20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ef30: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
ef40: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
ef50: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
ef60: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
ef70: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
ef80: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
ef90: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
efa0: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
efb0: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
efc0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
efd0: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
efe0: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
eff0: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
f000: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
f010: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
f020: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f030: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
f040: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
f050: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
f060: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
f070: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
f080: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
f090: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
f0a0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
f0b0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
f0c0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
f0d0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f0e0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
f0f0: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
f100: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
f110: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
f120: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
f130: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
f140: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
f150: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
f160: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
f170: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
f180: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
f190: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
f1a0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
f1b0: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
f1c0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
f1d0: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
f1e0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f1f0: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
f200: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
f210: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f220: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
f230: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
f240: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
f250: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f260: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
f270: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f280: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f290: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
f2a0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
f2b0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f2c0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
f2d0: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
f2e0: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
f2f0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f300: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
f310: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f320: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
f330: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f340: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f350: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f370: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f380: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f390: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
f3a0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f3b0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
f3c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f3d0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
f3e0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
f3f0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
f400: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
f410: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f420: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f430: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f440: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
f450: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f460: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
f470: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f480: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
f490: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
f4a0: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
f4b0: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
f4c0: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
f4d0: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f4e0: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
f4f0: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
f500: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f510: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
f520: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
f530: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
f540: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
f550: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
f560: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
f570: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
f580: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
f590: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
f5a0: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
f5b0: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
f5c0: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
f5d0: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
f5e0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f5f0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f600: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f610: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f620: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f630: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f640: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f650: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f660: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f670: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f680: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f690: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f6a0: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
f6b0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
f6c0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
f6d0: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f6e0: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
f6f0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f700: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f710: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
f720: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
f730: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
f740: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
f750: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
f760: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f770: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
f780: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
f790: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
f7a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
f7b0: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
f7c0: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
f7d0: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
f7e0: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
f7f0: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
f800: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
f810: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f820: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
f830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f840: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
f860: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
f870: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
f880: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
f890: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
f8a0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
f8b0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
f8c0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
f8d0: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
f8e0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
f8f0: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
f900: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
f910: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
f920: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
f930: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
f940: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
f950: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
f960: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
f970: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
f980: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
f990: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
f9a0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
f9b0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
f9c0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
f9d0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
f9e0: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
f9f0: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
fa00: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
fa10: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
fa20: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
fa30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
fa40: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fa50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa60: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fa70: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
fa80: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fa90: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
faa0: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
fab0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
fac0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
fad0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
fae0: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
faf0: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
fb00: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
fb10: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
fb20: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
fb30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
fb40: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
fb50: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
fb60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
fb70: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
fb80: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
fb90: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
fba0: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
fbb0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fbc0: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
fbd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fbe0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
fbf0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
fc00: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
fc10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fc20: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fc30: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fc40: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
fc50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fc60: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
fc70: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
fc80: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
fc90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fca0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
fcb0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fcc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fcd0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fce0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fcf0: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
fd00: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
fd10: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
fd20: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
fd30: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
fd40: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
fd50: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
fd60: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
fd70: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
fd80: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
fd90: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
fda0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
fdb0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
fdc0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
fdd0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
fde0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
fdf0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
fe00: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
fe10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
fe20: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
fe30: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
fe40: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
fe50: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
fe60: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
fe70: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
fe80: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
fe90: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
fea0: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
feb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
fec0: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
fed0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
fee0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
fef0: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
ff00: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
ff10: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
ff20: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
ff30: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
ff40: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
ff50: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
ff60: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
ff70: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
ff80: 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
ff90: 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
ffa0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
ffb0: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
ffc0: 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
ffd0: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
ffe0: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
fff0: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10000 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10010 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10020 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
10030 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
10040 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
10050 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
10060 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
10070 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
10080 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
10090 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
100a0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
100b0 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
100c0 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
100d0 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
100e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
100f0 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
10100 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
10110 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
10120 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
10130 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10140 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
10150 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
10160 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
10170 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
10180 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20  if needed.  See 
10190 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e  also: btreeGetUn
101a0 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  usedPage()..**.*
101b0 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47  * If the PAGER_G
101c0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61  ET_NOCONTENT fla
101d0 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
101e0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
101f0 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20  t care.** about 
10200 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
10210 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
10220 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
10230 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
10240 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
10250 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
10260 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
10270 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
10280 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
10290 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
102a0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
102b0 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
102c0 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
102d0 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
102e0 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
102f0 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
10300 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
10310 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
10320 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
10330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10340 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
10350 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10360 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
10370 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
10380 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
10390 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
103a0 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
103b0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
103c0 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
103d0 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
103e0 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
103f0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
10400 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
10410 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
10420 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
10430 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
10440 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10450 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66  ge;..  assert( f
10460 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
10470 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ==PAGER_GET_NOCO
10480 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d  NTENT || flags==
10490 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
104a0 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LY );.  assert( 
104b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
104c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
104d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
104e0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
104f0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
10500 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
10510 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
10520 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10530 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
10540 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
10550 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
10560 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
10570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10580 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
10590 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
105a0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
105b0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
105c0 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
105d0 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
105e0 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
105f0 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
10600 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10610 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10620 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10630 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
10640 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
10650 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
10660 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
10670 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
10680 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
10690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
106a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
106b0 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
106c0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
106d0 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
106e0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
106f0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
10700 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
10710 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
10720 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
10730 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10740 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
10750 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
10760 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
10770 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
10780 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
10790 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
107a0 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
107b0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
107c0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
107d0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
107e0 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
107f0 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
10800 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
10810 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
10820 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
10830 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
10840 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
10850 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
10860 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
10870 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
10880 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
10890 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
108a0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
108b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
108c0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
108d0 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
108e0 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
108f0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
10900 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
10910 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
10920 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
10930 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
10940 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
10950 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
10960 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
10970 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
10980 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
10990 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
109a0 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
109b0 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
109c0 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
109d0 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
109e0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
109f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10a00 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
10a10 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
10a20 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
10a30 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
10a40 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
10a50 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
10a60 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
10a70 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
10a80 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
10a90 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
10aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
10ac0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10af0 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
10b00 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10b10 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
10b20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
10b30 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
10b40 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
10b50 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
10b60 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10b70 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
10b80 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
10b90 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
10ba0 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
10bb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10bc0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
10bd0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
10be0 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10bf0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
10c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10c10 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10c20 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
10c30 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
10c40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
10c50 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
10c60 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
10c70 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
10c80 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
10c90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
10ca0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
10cb0 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
10cc0 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
10cd0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
10ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
10cf0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
10d00 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
10d10 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
10d20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10d30 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
10d40 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
10d50 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62  ge**)&pDbPage, b
10d60 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28  ReadOnly);.  if(
10d70 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   rc ){.    goto 
10d80 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
10d90 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  rror;.  }.  *ppP
10da0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
10db0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10dc0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10dd0 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
10de0 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
10df0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
10e00 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
10e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
10e30 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
10e40 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  );.      goto ge
10e50 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
10e60 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
10e70 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
10e80 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
10e90 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
10ea0 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
10eb0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
10ec0 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
10ed0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
10ee0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 0a 20 20  */.  if( pCur.  
10ef0 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
10f00 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
10f10 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
10f20 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 0a 20  ur->curIntKey). 
10f30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10f40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10f50 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
10f60 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
10f70 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
10f80 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
10f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10fa0 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
10fb0 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
10fc0 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
10fd0 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
10fe0 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
10ff0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11000 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11010 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11030 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11040 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
11050 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
11060 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
11070 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
11080 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
11090 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
110a0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
110b0 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
110c0 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
110d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
110e0 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
110f0 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11100 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11110 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11120 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11130 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11140 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
11150 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11160 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
11170 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
11180 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
11190 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
111a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
111b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
111c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
111d0 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
111e0 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
111f0 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11200 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11210 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11220 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11230 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11240 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
11250 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
11260 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
11270 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
11280 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
11290 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
112a0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
112b0 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
112c0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
112d0 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
112e0 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
112f0 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
11300 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
11310 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
11320 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
11330 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
11340 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
11350 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
11360 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
11370 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
11380 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
11390 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
113a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
113b0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
113c0 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
113d0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
113e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
113f0 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11400 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11410 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11420 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11430 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11440 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
11450 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
11460 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
11470 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
11480 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
11490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
114a0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
114b0 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
114c0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
114d0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
114e0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
114f0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
11500 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
11510 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11520 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
11530 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11540 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
11550 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
11560 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11570 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
11580 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
11590 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
115a0 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
115b0 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
115c0 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
115d0 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
115e0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
115f0 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
11600 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
11610 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
11620 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
11630 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11640 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
11650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
11660 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
11670 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
11680 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
11690 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
116a0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
116b0 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
116c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
116d0 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
116e0 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
116f0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
11700 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
11710 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11720 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
11730 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11740 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
11750 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
11760 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
11770 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
11780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11790 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
117a0 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
117b0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
117c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
117d0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
117e0 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
117f0 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
11800 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
11810 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
11820 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
11830 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
11840 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
11850 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
11860 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
11870 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
11880 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
11890 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
118a0 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
118b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
118c0 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
118d0 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
118e0 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
118f0 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
11900 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
11910 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
11920 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
11930 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
11940 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
11950 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
11960 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
11970 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
11980 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
11990 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
119a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
119b0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
119c0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
119d0 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
119e0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
119f0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11a00 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
11a10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11a20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
11a30 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11a40 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
11a50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11a60 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
11a70 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
11a80 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11a90 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
11aa0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
11ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11ad0 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
11ae0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11af0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11b00 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
11b10 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
11b20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
11b30 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
11b40 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
11b50 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
11b60 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
11b70 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
11b80 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
11b90 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
11ba0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
11bb0 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
11bc0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
11bd0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
11be0 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
11bf0 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
11c00 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
11c10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11c20 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
11c30 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
11c40 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
11c50 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
11c60 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
11c70 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
11c80 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11c90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
11ca0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
11cb0 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
11cc0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
11cd0 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
11ce0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
11cf0 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
11d00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11d10 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11d20 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
11d30 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11d40 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
11d50 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
11d60 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
11d70 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
11d80 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
11d90 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11da0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
11db0 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
11dc0 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
11dd0 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
11de0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
11df0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
11e00 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
11e10 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
11e20 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
11e30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11e40 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
11e50 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
11e60 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
11e70 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
11e80 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
11e90 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
11ea0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
11eb0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
11ec0 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
11ed0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
11ee0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
11ef0 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
11f00 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
11f10 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
11f20 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
11f30 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
11f40 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
11f50 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
11f60 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
11f70 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
11f80 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
11f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
11fa0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
11fb0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
11fc0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
11fd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11fe0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11ff0 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12000 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12010 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12040 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
12050 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
12060 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
12070 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
12080 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
12090 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
120a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
120b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
120c0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
120d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
120e0 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12110 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12120 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12130 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12140 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
12150 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
12160 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
12170 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
12180 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
12190 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
121a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
121b0 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
121c0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
121d0 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
121e0 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
121f0 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12200 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12210 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12220 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12230 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12240 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
12250 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12260 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
12270 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
12280 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
12290 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
122a0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
122b0 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
122c0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
122f0 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
12300 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
12330 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12340 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
12350 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
12360 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12370 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
12380 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12390 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
123a0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
123b0 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
123c0 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
123d0 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
123e0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
123f0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
12400 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
12410 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
12420 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12430 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
12440 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
12450 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
12460 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
12470 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
12480 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
12490 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
124a0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
124b0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
124c0 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
124d0 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
124e0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
124f0 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
12500 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
12510 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
12520 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12530 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
12540 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
12550 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
12560 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
12570 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
12580 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
12590 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
125a0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
125b0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
125c0 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
125d0 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
125e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
125f0 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
12600 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12610 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
12620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12630 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12640 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
12650 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
12660 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
12670 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
12680 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
12690 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
126a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
126b0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
126c0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
126d0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
126e0 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
126f0 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
12700 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
12710 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
12720 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
12730 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
12740 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
12750 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
12760 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
12770 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
12780 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
12790 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
127a0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
127b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
127c0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
127d0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
127e0 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
127f0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
12800 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12810 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
12820 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
12830 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
12840 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
12850 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
12860 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
12870 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
12880 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
12890 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
128a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
128b0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
128c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
128d0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
128e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
128f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
12900 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
12910 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
12920 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
12930 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  e, zFilename, nF
12940 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
12950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
12960 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
12970 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
12980 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46                nF
129b0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
129c0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
129d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
129e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
129f0 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
12a00 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
12a10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
12a20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12a30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
12a40 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
12a50 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
12a60 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
12a70 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
12a80 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
12a90 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
12aa0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12ab0 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
12ac0 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
12ad0 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
12ae0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
12af0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
12b00 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
12b10 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
12b20 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65  mutexShared);.#e
12b30 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70  ndif.      for(p
12b40 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
12b50 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
12b60 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
12b70 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
12b80 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
12b90 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
12ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
12bb0 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
12bc0 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
12bd0 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
12be0 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20  >pPager, 0)).   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
12c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
12c10 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
12c20 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
12c30 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
12c40 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
12c50 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
12c60 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
12c70 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
12c80 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
12c90 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
12ca0 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
12cb0 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
12cc0 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
12cd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12ce0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12cf0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
12d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12d10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12d20 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
12d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12d40 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
12d50 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
12d60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12d70 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
12d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12d90 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
12da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12dc0 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
12dd0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
12de0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
12df0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
12e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12e10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12e20 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
12e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12e40 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
12e50 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
12e60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
12e70 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
12e80 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
12e90 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
12ea0 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
12eb0 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
12ec0 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
12ed0 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
12ee0 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
12ef0 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
12f00 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
12f10 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
12f20 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
12f30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12f40 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
12f50 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
12f60 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
12f70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12f80 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
12f90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12fa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
12fb0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
12fc0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
12fd0 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
12fe0 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
12ff0 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
13000 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
13010 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
13020 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
13030 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
13040 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
13050 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
13060 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
13070 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
13080 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
13090 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
130a0 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a  zeof(i64)==8 );.
130b0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
130c0 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(u64)==8 );.  
130d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
130e0 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
130f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13100 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
13110 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
13120 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
13130 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
13140 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
13150 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
13160 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
13170 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
13180 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
13190 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
131a0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
131b0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
131c0 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
131d0 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
13200 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
13210 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
13220 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13240 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13250 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
13260 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
13270 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
13280 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
13290 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
132a0 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
132b0 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
132c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
132d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
132e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
132f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13300 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
13310 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
13320 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
13330 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
13340 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
13350 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
13360 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
13370 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
13380 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
13390 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
133a0 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
133b0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
133c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
133d0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
133e0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
133f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13400 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
13410 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
13420 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42  RE_DELETE.    pB
13430 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13440 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
13450 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
13460 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
13470 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
13480 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
13490 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
134a0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
134b0 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
134c0 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
134d0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
134e0 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
134f0 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
13500 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
13510 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
13520 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
13530 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
13540 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
13550 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
13560 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
13570 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
13580 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
13590 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
135a0 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
135b0 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
135c0 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
135d0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
135e0 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
135f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13600 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
13610 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
13620 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
13630 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
13640 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
13650 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
13660 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
13670 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
13680 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
13690 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
136a0 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
136b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
136c0 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
136d0 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
136e0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
136f0 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
13700 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
13710 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
13720 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
13730 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
13740 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13750 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
13760 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
13770 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
13780 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
13790 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
137a0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
137b0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
137c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
137d0 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
137e0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
137f0 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
13800 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13810 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
13820 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
13830 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
13840 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
13850 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
13860 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
13870 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
13880 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
13890 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  gion is.      **
138a0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
138b0 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
138c0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
138d0 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
138e0 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69  of 20.      ** i
138f0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
13900 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
13910 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13920 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
13930 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
13940 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
13950 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
13960 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13970 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
13980 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13990 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
139a0 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
139b0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
139c0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
139d0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
139e0 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
139f0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
13a00 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13a10 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
13a20 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
13a30 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
13a40 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
13a50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
13a60 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
13a70 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
13a80 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
13a90 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
13aa0 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
13ab0 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
13ac0 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
13ad0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
13ae0 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
13af0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13b00 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13b10 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
13b20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
13b30 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
13b40 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
13b50 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
13b60 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
13b70 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
13b80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
13b90 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
13ba0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
13bb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13bc0 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
13bd0 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
13be0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
13bf0 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
13c00 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13c10 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13c20 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
13c30 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
13c40 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
13c50 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
13c60 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
13c70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
13c80 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
13c90 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
13ca0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
13cb0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
13cc0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
13cd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13ce0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
13cf0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
13d00 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
13d10 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
13d20 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
13d30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13d40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13d50 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
13d60 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
13d70 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
13d80 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
13d90 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
13da0 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
13db0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
13dc0 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
13dd0 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
13de0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13df0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13e00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
13e10 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13e20 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13e30 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
13e40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
13e50 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
13e60 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
13e70 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
13e80 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
13e90 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
13ea0 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
13eb0 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
13ec0 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
13ed0 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
13ee0 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
13ef0 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
13f00 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
13f10 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
13f20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
13f30 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
13f40 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
13f50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13f60 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
13f70 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
13f80 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
13f90 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
13fa0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
13fb0 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
13fc0 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
13fd0 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
13fe0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
13ff0 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
14000 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14010 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
14020 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
14030 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
14040 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
14050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14060 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
14070 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
14080 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
14090 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
140a0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
140b0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
140c0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
140d0 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
140e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
140f0 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
14100 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
14110 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
14120 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
14130 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
14140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14150 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
14160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14180 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14190 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
141a0 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
141b0 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
141c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
141d0 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
141e0 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
141f0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
14200 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14210 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
14220 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
14230 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
14240 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
14250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
14260 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
14270 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
14280 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
14290 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
142a0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
142b0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
142c0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
142d0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
142e0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
142f0 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
14300 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
14310 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
14320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14330 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
14340 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
14350 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14360 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
14370 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
14380 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
14390 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
143a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
143b0 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
143c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
143d0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
143e0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
143f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14400 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
14410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14420 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
14430 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
14440 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
14450 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
14460 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
14470 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
14480 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
14490 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
144a0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
144b0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
144c0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
144d0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
144e0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
144f0 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
14500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
14510 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
14520 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
14530 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
14540 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14550 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
14560 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
14570 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
14580 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
14590 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
145a0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
145b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
145c0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
145d0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
145e0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
145f0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14600 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14610 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
14620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14630 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
14640 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
14650 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
14660 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
14670 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14680 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14690 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
146a0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
146b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
146c0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
146d0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
146e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
146f0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
14700 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
14710 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
14720 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
14730 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
14740 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
14750 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
14760 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
14770 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
14780 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
14790 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
147a0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
147b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
147c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
147d0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
147e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
147f0 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
14800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
14810 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
14820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14830 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
14840 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
14850 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
14860 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14870 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
14880 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
14890 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
148a0 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
148b0 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
148c0 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20  s with a 4-byte 
148d0 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66  prefix for a lef
148e0 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74  t-child.** point
148f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
14900 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
14910 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
14920 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
14930 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
14940 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14950 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
14960 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
14970 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
14980 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
14990 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
149a0 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
149b0 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
149c0 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
149d0 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
149e0 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
149f0 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
14a00 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
14a10 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
14a20 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
14a30 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
14a40 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
14a50 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
14a60 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
14a70 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
14a80 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
14a90 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
14aa0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
14ab0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
14ac0 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
14ad0 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
14ae0 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
14af0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14b00 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
14b10 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
14b20 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
14b30 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
14b40 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
14b50 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
14b60 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
14b70 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
14b80 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
14b90 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
14ba0 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
14bb0 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
14bc0 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
14bd0 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
14be0 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
14bf0 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
14c00 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
14c10 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  pace here..    *
14c20 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20  *.    ** Also:  
14c30 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74  Provide four byt
14c40 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65  es of initialize
14c50 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74  d space before t
14c60 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e  he.    ** beginn
14c70 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65  ing of pTmpSpace
14c80 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69   as an area avai
14c90 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64  lable to prepend
14ca0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
14cb0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74  -child pointer t
14cc0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
14cd0 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a  of a cell..    *
14ce0 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
14cf0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
14d00 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54    memset(pBt->pT
14d10 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a  mpSpace, 0, 8);.
14d20 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
14d30 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  pace += 4;.    }
14d40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
14d50 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
14d60 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
14d70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14d80 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
14d90 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14da0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
14db0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14dc0 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20  TmpSpace -= 4;. 
14dd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
14de0 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
14df0 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
14e00 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  pSpace = 0;.  }.
14e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
14e20 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
14e30 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
14e40 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
14e50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
14e60 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
14e70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14e80 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
14e90 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
14ea0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
14eb0 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
14ec0 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
14ed0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14ee0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
14ef0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14f00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14f10 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
14f20 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
14f30 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
14f40 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
14f50 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
14f60 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
14f70 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
14f80 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
14f90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
14fa0 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
14fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14fc0 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
14fd0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
14fe0 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
14ff0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
15000 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
15010 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
15020 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
15030 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
15040 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
15050 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
15060 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15070 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
15080 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  , 0);.  sqlite3B
15090 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
150a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
150b0 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
150c0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
150d0 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
150e0 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
150f0 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
15100 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
15110 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
15120 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
15130 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
15140 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
15150 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
15160 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
15170 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
15180 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
15190 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
151a0 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
151b0 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
151c0 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
151d0 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
151e0 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
151f0 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
15200 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
15210 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
15220 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
15230 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
15240 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
15250 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
15260 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
15270 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
15280 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
15290 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
152a0 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
152b0 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
152c0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
152d0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
152e0 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
152f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
15300 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63  Free(0, pBt->pSc
15310 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
15320 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
15330 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15340 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
15350 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15360 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
15370 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
15380 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
15390 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
153a0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
153b0 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
153c0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
153d0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
153e0 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
153f0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
15400 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
15410 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
15420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15430 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
15440 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
15450 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
15460 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
15470 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
15480 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
15490 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
154a0 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
154b0 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
154c0 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
154d0 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
154e0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
154f0 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
15500 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
15510 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
15520 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
15530 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
15540 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
15550 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
15560 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
15570 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
15580 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
15590 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
155a0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
155b0 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
155c0 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
155d0 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
155e0 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
155f0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
15600 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
15610 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
15620 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
15630 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
15640 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
15650 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
15660 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
15670 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
15680 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
15690 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
156a0 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
156b0 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
156c0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
156d0 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
156e0 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
156f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
15700 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
15710 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15720 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15730 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
15740 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15750 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15760 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15770 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15780 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
15790 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
157a0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
157b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
157c0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
157d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
157e0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
157f0 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15800 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15810 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15830 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15840 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15860 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15870 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15880 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15890 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
158a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
158b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
158c0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
158d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
158e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
158f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15900 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15910 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15920 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15930 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15950 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15960 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15970 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15980 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15990 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
159a0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
159b0 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
159c0 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
159d0 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
159e0 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
159f0 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15a00 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15a10 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15a20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15a30 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15a40 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15a50 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15a60 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15a70 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15a80 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15a90 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15aa0 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15ab0 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15ac0 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15ad0 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15ae0 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15af0 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15b00 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15b10 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15b20 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15b30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15b40 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15b50 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15b60 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15b70 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b90 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
15ba0 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
15bb0 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
15bc0 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
15bd0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
15be0 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
15bf0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15c00 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15c10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15c20 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15c30 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15c40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c50 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
15c60 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
15c70 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
15c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15c90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
15cb0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
15cc0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
15cd0 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
15ce0 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
15cf0 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
15d00 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
15d10 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
15d20 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
15d30 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
15d40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
15d50 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
15d60 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
15d70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15d80 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
15d90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15da0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
15db0 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
15dc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
15de0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
15df0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15e00 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
15e10 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
15e20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15e30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15e40 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
15e50 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
15e60 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
15e70 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15e80 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
15e90 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
15ea0 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
15eb0 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
15ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
15ed0 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
15ee0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
15ef0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
15f00 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
15f10 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
15f20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
15f30 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
15f40 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
15f50 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
15f60 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
15f70 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
15f80 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
15f90 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
15fa0 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
15fb0 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
15fc0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
15fd0 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
15fe0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
15ff0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
16000 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
16010 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
16020 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
16030 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
16040 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
16050 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
16060 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
16070 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16080 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
16090 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
160a0 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
160b0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
160c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
160d0 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
160e0 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
160f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
16100 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
16110 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
16120 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
16130 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
16140 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
16150 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
16160 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
16170 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
16180 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16190 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
161a0 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
161b0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
161c0 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
161d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
161e0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
161f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16200 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
16210 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
16220 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
16230 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16240 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
16250 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73  CODEC.  if( nRes
16260 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  erve>pBt->optima
16270 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e  lReserve ) pBt->
16280 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d  optimalReserve =
16290 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23   (u8)nReserve;.#
162a0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d  endif.  if( pBt-
162b0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
162c0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
162d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
162e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
162f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
16300 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
16310 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
16320 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
16330 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
16340 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
16350 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
16360 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
16370 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
16380 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
16390 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
163a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
163b0 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
163c0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
163d0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
163e0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
163f0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
16400 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16410 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
16420 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
16430 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
16440 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
16450 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
16460 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16470 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
16480 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
16490 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
164a0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
164b0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
164c0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
164d0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
164e0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
164f0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
16500 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
16510 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16530 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
16540 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
16550 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
16560 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
16570 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
16580 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
16590 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
165a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
165b0 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
165c0 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
165d0 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
165e0 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
165f0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
16600 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
16610 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16620 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
16630 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
16640 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
16650 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
16660 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
16670 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
16680 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
16690 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
166a0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
166b0 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
166c0 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
166d0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
166e0 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
166f0 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
16700 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
16710 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
16720 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
16730 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
16740 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
16750 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
16760 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
16770 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
16780 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
16790 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
167a0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
167b0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
167c0 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
167d0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  p){.  int n;.  a
167e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
167f0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
16800 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20  ->mutex) );.  n 
16810 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
16820 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
16830 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  bleSize;.  retur
16840 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
16850 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16860 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
16870 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
16880 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
16890 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
168a0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
168b0 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
168c0 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
168d0 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
168e0 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
168f0 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sions..**.** If 
16900 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58  SQLITE_HAS_MUTEX
16910 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
16920 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   the number retu
16930 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67  rned is the.** g
16940 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75  reater of the cu
16950 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73  rrent reserved s
16960 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78  pace and the max
16970 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a  imum requested.*
16980 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e  * reserve space.
16990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
169a0 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
169b0 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
169c0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
169d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
169e0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ;.  n = sqlite3B
169f0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16a00 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66  Mutex(p);.#ifdef
16a10 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16a20 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74  C.  if( n<p->pBt
16a30 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16a40 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f   ) n = p->pBt->o
16a50 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23  ptimalReserve;.#
16a60 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
16a70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16a80 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
16a90 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
16aa0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
16ab0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
16ac0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
16ad0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
16ae0 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
16af0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
16b00 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
16b10 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
16b20 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
16b30 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
16b40 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
16b50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16b60 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
16b70 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16b80 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
16b90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16ba0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
16bb0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
16bc0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
16bd0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
16be0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16bf0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
16c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16c10 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
16c20 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
16c30 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
16c40 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
16c50 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
16c60 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
16c70 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
16c80 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
16c90 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
16ca0 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
16cb0 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
16cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
16cd0 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
16ce0 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
16cf0 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
16d00 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
16d10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16d20 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
16d30 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
16d40 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
16d50 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
16d60 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
16d70 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
16d80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16d90 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16da0 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
16db0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
16dc0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
16dd0 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
16de0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16df0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
16e00 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16e10 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
16e20 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
16e30 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
16e40 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
16e50 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
16e60 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
16e70 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
16e80 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
16e90 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
16ea0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
16eb0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
16ec0 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
16ed0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
16ee0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
16ef0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
16f00 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
16f10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16f20 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
16f30 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
16f40 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
16f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16f60 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
16f70 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16f80 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
16f90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16fa0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16fb0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
16fc0 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
16fd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
16fe0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
16ff0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17000 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
17010 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
17020 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
17030 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
17040 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
17050 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
17060 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
17070 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
17080 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
17090 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
170a0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
170b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
170c0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
170d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
170e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
170f0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
17100 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
17110 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
17120 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
17130 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
17140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17150 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
17160 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
17170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17180 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17190 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
171a0 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
171b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
171c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
171d0 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
171e0 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
171f0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
17200 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
17210 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
17220 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17230 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
17240 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
17250 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
17260 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17270 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17280 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
17290 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
172a0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
172b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
172c0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
172d0 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
172e0 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
172f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
17300 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17310 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
17320 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
17330 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
17340 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
17350 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
17360 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
17370 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
17380 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
17390 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
173a0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
173b0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
173c0 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
173d0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
173e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
173f0 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
17400 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
17410 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17420 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
17430 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
17440 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
17450 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
17460 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
17470 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
17480 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
17490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
174a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
174b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
174c0 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
174d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
174e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
174f0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
17500 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
17510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17520 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
17530 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
17540 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
17550 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17560 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
17570 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17580 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
17590 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
175a0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
175b0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
175c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
175d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
175e0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
175f0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
17600 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
17610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17620 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
17630 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
17640 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
17650 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
17660 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
17670 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
17680 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
17690 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
176a0 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
176b0 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
176c0 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
176d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
176e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
176f0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
17700 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
17710 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
17720 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
17730 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
17740 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
17750 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
17760 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
17770 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
17780 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
17790 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
177a0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
177b0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
177c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
177d0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
177e0 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
177f0 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
17800 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
17810 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
17820 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
17830 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
17840 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
17850 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
17860 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
17870 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
17880 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
17890 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
178a0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
178b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
178c0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
178d0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
178e0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
178f0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
17900 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
17910 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17920 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
17930 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17940 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
17950 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17960 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
17970 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
17980 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
17990 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
179a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
179b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
179c0 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
179d0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
179e0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
179f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
17a00 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
17a10 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
17a20 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
17a30 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
17a40 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
17a50 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
17a60 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
17a70 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
17a80 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
17a90 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
17aa0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
17ab0 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
17ac0 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
17ad0 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
17ae0 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
17af0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
17b00 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
17b10 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
17b20 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
17b30 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
17b40 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
17b50 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
17b60 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
17b70 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
17b80 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
17b90 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
17ba0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
17bb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
17bc0 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
17bd0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17be0 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
17bf0 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
17c00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
17c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
17c20 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
17c30 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
17c40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
17c60 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17c70 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
17c80 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
17c90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
17ca0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
17cb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17cc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
17cd0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
17ce0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
17cf0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
17d00 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17d10 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65  -15465-20813 The
17d20 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e   maximum and min
17d30 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61  imum embedded pa
17d40 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61  yload.    ** fra
17d50 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c  ctions and the l
17d60 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
17d70 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74  tion values must
17d80 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20   be 64, 32, and 
17d90 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  32..    **.    *
17da0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
17db0 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
17dc0 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
17dd0 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
17de0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
17df0 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
17e00 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
17e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17e20 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
17e30 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
17e40 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
17e50 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17e60 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17e70 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17e80 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
17e90 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
17ea0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
17eb0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
17ec0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
17ed0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
17ee0 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
17ef0 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
17f00 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
17f10 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
17f20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
17f30 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20  */.    pageSize 
17f40 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
17f50 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
17f60 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  6);.    /* EVIDE
17f70 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d  NCE-OF: R-25008-
17f80 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f  21688 The size o
17f90 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f  f a page is a po
17fa0 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a  wer of two.    *
17fb0 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  * between 512 an
17fc0 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76  d 65536 inclusiv
17fd0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28  e. */.    if( ((
17fe0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
17ff0 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
18000 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
18010 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
18020 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
18030 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
18040 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18050 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18060 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
18070 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
18080 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
18090 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35  CE-OF: R-59310-5
180a0 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76  1205 The "reserv
180b0 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69  ed space" size i
180c0 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20  n the 1-byte.   
180d0 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f   ** integer at o
180e0 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20  ffset 20 is the 
180f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18100 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
18110 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61  end of.    ** ea
18120 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72  ch page to reser
18130 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e  ve for extension
18140 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s. .    **.    *
18150 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18160 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
18170 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
18180 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
18190 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
181a0 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
181b0 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
181c0 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
181d0 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
181e0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
181f0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
18200 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53  . */.    usableS
18210 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
18220 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
18230 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
18240 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
18250 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
18260 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
18270 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
18280 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
18290 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
182a0 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
182b0 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
182c0 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
182d0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
182e0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
182f0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
18300 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
18310 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
18320 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
18330 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
18340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
18350 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
18360 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
18370 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
18380 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
18390 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
183a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
183b0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
183c0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
183d0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
183e0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
183f0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
18400 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
18410 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
18420 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18430 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
18440 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
18450 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
18460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18480 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
18490 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
184a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
184b0 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
184c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
184d0 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
184e0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
184f0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
18500 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
18510 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
18520 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
18530 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
18540 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18550 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
18560 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
18570 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
18580 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
18590 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
185a0 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
185b0 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
185c0 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
185d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
185e0 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
185f0 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
18600 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
18610 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
18620 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18630 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18640 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
18650 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
18660 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
18670 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
18680 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
18690 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
186a0 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
186b0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
186c0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
186d0 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
186e0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
186f0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
18700 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
18710 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
18720 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
18730 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
18740 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
18750 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
18760 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
18770 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
18780 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
18790 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
187a0 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
187b0 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
187c0 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
187d0 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
187e0 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
187f0 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
18800 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
18810 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
18820 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
18830 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
18840 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
18850 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
18860 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
18870 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
18880 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
18890 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
188a0 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
188b0 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
188c0 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
188d0 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
188e0 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
188f0 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
18900 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
18910 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
18920 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
18930 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
18940 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
18950 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
18960 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
18970 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
18980 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
18990 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
189a0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
189b0 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
189c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
189d0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
189e0 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
189f0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
18a00 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
18a10 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
18a20 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18a30 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
18a40 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
18a50 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
18a60 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
18a70 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
18a80 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
18a90 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
18aa0 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
18ab0 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
18ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
18ad0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
18ae0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
18af0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
18b00 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
18b10 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
18b20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18b30 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
18b40 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
18b50 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18b60 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
18b70 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
18b80 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
18b90 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
18ba0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
18bb0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
18bc0 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
18bd0 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
18be0 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
18bf0 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
18c00 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
18c10 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
18c20 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
18c30 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
18c40 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
18c50 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
18c60 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
18c70 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
18c80 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
18c90 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
18ca0 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
18cb0 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
18cc0 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
18cd0 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
18ce0 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
18cf0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
18d00 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72  atabase.  Cursor
18d10 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
18d20 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f  een tripped into
18d30 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c   the CURSOR_FAUL
18d40 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20  T state are not 
18d50 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  counted..*/.stat
18d60 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69  ic int countVali
18d70 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  dCursors(BtShare
18d80 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e  d *pBt, int wrOn
18d90 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
18da0 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
18db0 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
18dc0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
18dd0 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
18de0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77  ext){.    if( (w
18df0 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75  rOnly==0 || (pCu
18e00 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
18e10 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30  CF_WriteFlag)!=0
18e20 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  ).     && pCur->
18e30 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
18e40 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
18e50 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
18e60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
18e70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
18e80 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
18e90 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
18ea0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
18eb0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
18ec0 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
18ed0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
18ee0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
18ef0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
18f00 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
18f10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
18f20 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
18f30 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
18f40 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
18f50 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
18f60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
18f70 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
18f80 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
18f90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18fa0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18fb0 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
18fc0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
18fd0 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
18fe0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18ff0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
19000 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
19010 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
19020 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70  s(pBt,0)==0 || p
19030 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19040 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
19050 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
19060 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
19070 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
19080 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  ge1!=0 ){.    Me
19090 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
190a0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
190b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d   assert( pPage1-
190c0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
190d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
190e0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
190f0 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
19100 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
19110 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
19120 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31  geNotNull(pPage1
19130 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19140 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
19150 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
19160 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
19170 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
19180 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
19190 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
191a0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
191b0 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
191c0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
191d0 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
191e0 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
191f0 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
19200 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
19210 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
19220 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19230 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19240 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
19250 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
19260 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
19270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19280 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
19290 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
192a0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
192b0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
192c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
192d0 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
192e0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
192f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19300 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
19310 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
19320 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
19330 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
19340 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
19350 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
19360 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
19370 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
19380 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
19390 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
193a0 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
193b0 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
193c0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
193d0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
193e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
193f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
19400 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
19410 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
19420 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
19430 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
19440 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
19450 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
19460 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
19470 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
19480 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
19490 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
194a0 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
194b0 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
194c0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
194d0 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
194e0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
194f0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
19500 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
19510 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19520 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
19530 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
19540 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
19550 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
19560 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
19570 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
19580 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
19590 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
195a0 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
195b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
195c0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
195d0 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
195e0 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
195f0 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
19600 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
19610 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
19620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19630 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
19640 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
19650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19660 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
19670 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
19680 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
19690 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
196a0 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
196b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
196c0 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
196d0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
196e0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
196f0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
19700 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
19710 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
19720 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19730 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
19740 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
19750 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
19760 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
19770 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19780 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19790 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
197a0 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
197b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
197c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
197d0 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
197e0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
197f0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
19800 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
19810 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
19820 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
19830 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
19840 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
19850 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
19860 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
19870 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
19880 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
19890 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
198a0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
198b0 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
198c0 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
198d0 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
198e0 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
198f0 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
19900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
19910 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
19920 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
19930 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
19940 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
19950 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
19960 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19970 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
19980 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
19990 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
199a0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
199b0 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
199c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
199d0 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
199e0 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
199f0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
19a00 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
19a10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19a20 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
19a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19a40 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
19a50 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19a60 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
19a70 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19a80 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
19a90 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19aa0 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
19ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19ac0 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
19ad0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
19ae0 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
19af0 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
19b00 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
19b10 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
19b20 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
19b30 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
19b40 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
19b50 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19b60 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
19b70 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
19b80 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
19b90 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
19ba0 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
19bb0 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
19bc0 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
19bd0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
19be0 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
19bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
19c00 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
19c10 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
19c20 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
19c30 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
19c40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
19c50 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
19c60 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
19c70 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
19c80 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
19c90 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
19ca0 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
19cb0 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
19cc0 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
19cd0 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
19ce0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
19cf0 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
19d00 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
19d10 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
19d20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
19d30 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
19d40 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
19d50 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
19d60 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
19d70 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
19d80 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
19d90 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
19da0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
19db0 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
19dc0 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
19dd0 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
19de0 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
19df0 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
19e00 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
19e10 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
19e20 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
19e30 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
19e40 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
19e50 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
19e60 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
19e70 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
19e80 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19e90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19ea0 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
19eb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
19ec0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
19ed0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
19ee0 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
19ef0 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
19f00 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
19f10 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
19f20 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
19f30 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
19f40 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
19f50 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
19f60 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
19f70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
19f80 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19f90 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
19fa0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
19fb0 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
19fc0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
19fd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19fe0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19ff0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a000 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1a010 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1a020 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
1a030 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1a040 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1a050 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1a060 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1a070 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1a080 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1a090 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1a0a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a0b0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1a0c0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a0d0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1a0e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a0f0 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
1a100 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
1a110 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
1a120 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
1a130 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
1a140 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1a150 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1a160 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1a170 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1a180 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
1a190 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1a1a0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
1a1b0 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
1a1c0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1a1d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1a1e0 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  E).   || (pBt->b
1a1f0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1a200 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20  NDING)!=0.  ){. 
1a210 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
1a220 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
1a230 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
1a240 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
1a250 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
1a260 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1a270 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1a280 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1a290 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1a2a0 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
1a2b0 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
1a2c0 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
1a2d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1a2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a2f0 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
1a300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
1a310 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1a320 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1a330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
1a340 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
1a350 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
1a360 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
1a370 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
1a380 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
1a390 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1a3a0 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
1a3b0 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
1a3c0 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
1a3d0 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
1a3e0 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
1a3f0 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
1a400 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
1a410 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
1a420 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
1a430 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
1a440 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
1a450 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
1a460 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
1a470 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
1a480 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
1a490 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1a4a0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1a4b0 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
1a4c0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
1a4d0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
1a4e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1a4f0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1a500 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
1a510 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
1a520 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
1a530 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
1a540 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
1a550 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
1a560 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
1a570 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
1a580 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
1a590 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
1a5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a5b0 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
1a5c0 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
1a5d0 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
1a5e0 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
1a5f0 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
1a600 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1a610 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
1a620 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
1a630 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
1a640 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
1a650 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
1a660 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
1a670 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
1a680 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1a690 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1a6a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
1a6b0 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
1a6c0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
1a6d0 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
1a6e0 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
1a6f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a700 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1a710 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
1a720 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1a730 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
1a740 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a750 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1a760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a780 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
1a790 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
1a7a0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
1a7b0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1a7c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a7e0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1a7f0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1a800 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a810 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1a820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a830 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1a840 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1a850 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1a860 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1a870 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1a880 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a890 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1a8a0 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1a8b0 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1a8c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1a8d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1a8e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a8f0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1a900 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1a910 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1a920 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1a930 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1a940 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1a950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a960 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1a970 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1a980 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1a990 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1a9a0 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1a9b0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1a9c0 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1a9d0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1a9e0 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1a9f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1aa00 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1aa10 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1aa20 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1aa30 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1aa40 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1aa50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1aa60 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1aa70 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1aa80 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1aa90 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1aaa0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1aab0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1aac0 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1aad0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1aae0 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1aaf0 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1ab00 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1ab10 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1ab20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1ab30 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1ab40 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1ab50 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1ab60 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1ab70 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1ab80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1ab90 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1aba0 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1abb0 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1abc0 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1abd0 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1abe0 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1abf0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1ac00 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1ac10 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1ac20 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1ac30 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1ac40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1ac50 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1ac60 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1ac70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1ac80 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1ac90 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1aca0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1acb0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1acc0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1acd0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1ace0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1acf0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1ad00 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1ad10 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1ad20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad30 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1ad40 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1ad50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ad60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ad70 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1ad80 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1ad90 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1ada0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1adb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
1adc0 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
1add0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ade0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
1adf0 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
1ae00 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
1ae10 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
1ae20 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
1ae30 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
1ae40 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
1ae50 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1ae60 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
1ae70 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
1ae80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
1ae90 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
1aea0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
1aeb0 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
1aec0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1aed0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1aee0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1aef0 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
1af00 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
1af10 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1af20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1af30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1af40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1af50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1af60 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1af70 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1af80 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1af90 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1afa0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1afb0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1afc0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1afd0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1afe0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1aff0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1b000 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1b010 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1b020 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1b030 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1b040 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1b050 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1b060 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b080 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1b090 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1b0a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1b0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b0c0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1b0d0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1b0e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1b110 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1b120 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1b130 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
1b140 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
1b150 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
1b160 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
1b170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b180 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1b190 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1b1a0 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
1b1b0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1b1c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1b1d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1b1e0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
1b1f0 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
1b200 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1b210 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
1b220 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1b230 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1b240 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1b250 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
1b260 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
1b270 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
1b280 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1b290 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
1b2a0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1b2b0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
1b2c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1b2d0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1b2e0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1b2f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1b300 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
1b310 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1b320 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1b330 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1b340 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1b350 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
1b360 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1b370 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1b380 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1b390 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
1b3a0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
1b3b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1b3c0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
1b3d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b3e0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1b3f0 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1b400 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1b410 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1b420 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1b430 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1b440 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1b450 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1b460 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1b470 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1b480 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1b490 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1b4a0 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1b4b0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1b4c0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1b4d0 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1b4e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b4f0 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1b500 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1b510 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1b520 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1b530 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1b540 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1b550 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1b560 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1b570 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1b580 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1b590 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1b5a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1b5b0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1b5c0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1b5d0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1b5e0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1b600 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1b610 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1b620 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1b630 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1b640 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1b650 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1b660 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1b670 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b680 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1b690 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b6a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1b6b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1b6c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1b6d0 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1b6e0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1b6f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1b700 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1b710 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1b720 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1b730 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1b740 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1b750 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1b760 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1b770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1b780 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1b790 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
1b7a0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
1b7b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b7c0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
1b7d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
1b7e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1b7f0 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1b800 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62   rc;..    rc = b
1b810 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1b820 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1b830 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b840 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1b850 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1b860 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1b870 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1b880 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1b890 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1b8a0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1b8b0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1b8c0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1b8d0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1b8e0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1b8f0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1b900 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1b910 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
1b920 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
1b930 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
1b940 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
1b950 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
1b960 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
1b970 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
1b980 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
1b990 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
1b9a0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1b9b0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
1b9c0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
1b9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1b9e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1b9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ba00 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1ba10 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1ba20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ba30 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1ba40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1ba50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba60 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1ba70 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1ba80 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1ba90 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1baa0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1bab0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1bac0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1bad0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1bae0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1baf0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1bb00 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
1bb10 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1bb20 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1bb30 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1bb40 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
1bb50 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1bb60 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
1bb70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bb80 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1bb90 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1bba0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1bbb0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1bbc0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1bbd0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1bbe0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1bbf0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1bc00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1bc10 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1bc20 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1bc30 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1bc40 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1bc50 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1bc60 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1bc70 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1bc80 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1bc90 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1bca0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1bcb0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1bcc0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1bcd0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1bce0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1bcf0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1bd00 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1bd10 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1bd20 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1bd30 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1bd40 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1bd50 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1bd60 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1bd70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1bd80 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1bd90 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1bda0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1bdb0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1bdc0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1bdd0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1bde0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1bdf0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1be00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1be10 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1be20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1be30 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1be40 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1be50 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1be60 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1be70 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1be80 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1be90 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1bea0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1beb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1bec0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1bed0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1bee0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1bef0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1bf00 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1bf10 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1bf20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1bf30 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1bf40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1bf50 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1bf60 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1bf70 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1bf80 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1bf90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1bfa0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1bfb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1bfc0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1bfd0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1bfe0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1bff0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1c000 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1c010 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1c020 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1c030 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1c040 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1c050 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1c060 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1c070 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1c080 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1c090 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1c0a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1c0b0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1c0c0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1c0d0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1c0e0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1c0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c110 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1c120 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1c130 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1c140 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1c150 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1c160 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1c170 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1c180 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1c190 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1c1a0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1c1b0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1c1c0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1c1d0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1c1e0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1c1f0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1c200 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1c210 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1c220 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1c230 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1c240 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1c250 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1c260 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1c270 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1c280 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1c290 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1c2a0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1c2b0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1c2c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1c2d0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1c2e0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c2f0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1c300 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1c310 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1c320 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c340 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1c360 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1c370 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1c380 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1c390 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1c3a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1c3b0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1c3c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1c3d0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1c3e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c400 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c420 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1c430 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1c440 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1c450 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1c460 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1c470 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1c480 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1c490 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1c4a0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1c4b0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1c4c0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1c4d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1c4e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1c4f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1c500 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1c510 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1c520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1c540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1c550 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c560 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1c570 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1c580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c590 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1c5a0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1c5b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c5c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1c5d0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1c5e0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1c5f0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1c600 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1c610 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1c620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1c640 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1c650 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1c660 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1c670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c680 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1c690 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1c6a0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1c6b0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1c6c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1c6d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1c6e0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1c6f0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1c700 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1c710 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1c720 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1c730 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1c740 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1c750 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1c760 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1c770 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1c780 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1c790 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1c7a0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1c7b0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1c7c0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1c7d0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1c7e0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1c7f0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1c800 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1c810 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1c820 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1c830 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1c840 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1c850 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1c860 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1c870 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1c880 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1c890 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1c8a0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1c8b0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1c8c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1c8d0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1c8e0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1c8f0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1c900 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1c910 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1c920 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1c930 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1c940 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1c950 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1c960 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1c970 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1c980 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1c990 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1c9a0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1c9b0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1c9c0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1c9d0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1c9e0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1c9f0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1ca00 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ca10 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1ca20 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ca30 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1ca40 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1ca50 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1ca60 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1ca70 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1ca80 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1ca90 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1caa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cab0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1cac0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1cad0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1cae0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1caf0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1cb00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1cb10 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1cb20 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1cb30 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1cb40 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1cb50 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1cb60 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1cb70 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1cb80 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1cb90 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1cba0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1cbb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1cbc0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1cbd0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1cbe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cbf0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1cc00 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1cc10 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1cc20 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1cc30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1cc40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cc50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cc60 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1cc70 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1cc80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cc90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1cca0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1ccb0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1ccc0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1ccd0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1cce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1ccf0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1cd00 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1cd10 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1cd20 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1cd30 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1cd40 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1cd50 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1cd60 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1cd70 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1cd80 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1cd90 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1cda0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1cdb0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1cdc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1cdd0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1cde0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1cdf0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1ce00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ce10 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1ce20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1ce30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1ce40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1ce50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1ce60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1ce70 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1ce80 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1ce90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ceb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1ced0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1cee0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1cef0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1cf00 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1cf10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1cf20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cf40 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1cf50 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1cf60 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1cf70 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1cf80 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1cf90 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1cfa0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1cfb0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1cfc0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1cfd0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1cfe0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1cff0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1d000 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1d010 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1d020 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1d030 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1d040 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1d050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d070 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d080 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d090 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1d0a0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1d0b0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1d0c0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1d0d0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1d0e0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1d0f0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1d100 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1d110 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1d120 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1d130 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1d140 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1d150 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1d160 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1d170 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1d180 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1d190 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1d1a0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1d1b0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1d1c0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1d1d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1d1e0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1d1f0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1d200 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1d210 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1d220 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1d230 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1d240 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1d250 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1d260 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1d270 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1d280 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1d290 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1d2a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d2c0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1d2d0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1d2e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d2f0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1d300 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1d310 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1d320 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1d330 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1d340 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1d350 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1d360 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1d370 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1d380 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1d390 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1d3a0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1d3b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1d3c0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1d3d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d3e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1d3f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1d400 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1d410 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1d420 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1d430 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1d440 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1d450 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d460 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1d470 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1d480 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1d490 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1d4a0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1d4b0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1d4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1d4e0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1d4f0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1d500 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1d510 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1d520 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1d530 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1d540 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1d550 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1d560 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1d570 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d580 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1d590 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1d5a0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1d5b0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1d5c0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1d5d0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1d5e0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1d5f0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1d620 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1d630 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1d640 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d660 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1d670 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1d680 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1d690 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1d6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1d6b0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1d6c0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1d6d0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1d6e0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1d6f0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1d700 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1d710 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1d720 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1d730 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1d740 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1d750 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d760 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1d770 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d780 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1d790 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1d7a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d7b0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1d7c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d7d0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1d7e0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1d7f0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1d800 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1d810 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1d820 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1d830 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1d840 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1d850 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1d860 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1d870 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1d880 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1d890 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1d8a0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1d8b0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1d8c0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1d8d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1d8e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1d8f0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1d900 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1d910 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1d920 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d930 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1d940 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1d950 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1d960 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1d970 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1d980 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1d990 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1d9a0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1d9b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1d9c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1d9d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1d9e0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1d9f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1da00 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1da10 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1da20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1da30 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1da40 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1da50 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1da60 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1da70 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1da80 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1da90 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1daa0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1dab0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1dac0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1dad0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1dae0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1daf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1db00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1db10 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1db20 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1db30 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1db40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1db50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1db60 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1db70 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1db80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1db90 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1dba0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1dbb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1dbc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dbd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1dbe0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1dbf0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1dc00 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1dc10 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1dc20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1dc30 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1dc40 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1dc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1dc60 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1dc70 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1dc80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1dc90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dca0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1dcb0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1dcc0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1dcd0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1dce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1dcf0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1dd00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1dd10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1dd20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1dd30 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1dd40 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1dd50 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1dd60 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1dd70 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1dd80 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1dd90 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1dda0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1ddb0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1ddc0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1ddd0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1dde0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1ddf0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1de00 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1de10 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1de20 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1de30 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1de40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1de50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1de60 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1de70 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1de80 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1de90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1dea0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1deb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1dec0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1ded0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1dee0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1def0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1df00 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1df10 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1df20 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1df30 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1df40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df50 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1df60 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1df70 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1df80 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1df90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1dfa0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1dfb0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1dfc0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1dfd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1dfe0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1dff0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1e000 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1e010 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1e020 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1e030 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1e040 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1e050 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1e060 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1e070 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1e080 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e090 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1e0a0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1e0b0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1e0c0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1e0d0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1e0e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1e0f0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1e100 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1e110 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1e120 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1e130 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1e140 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1e150 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1e160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1e170 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e180 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1e190 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1e1a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e1b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e1c0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1e1d0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1e1e0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1e1f0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1e200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e210 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e220 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1e230 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1e240 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1e250 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1e260 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1e270 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1e280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1e290 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1e2a0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1e2b0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1e2c0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1e2d0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1e2e0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1e2f0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1e300 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1e310 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e320 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1e330 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1e340 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e350 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e360 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1e370 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1e380 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1e390 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1e3a0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e3b0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1e3c0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1e3d0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1e3e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1e3f0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1e400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1e420 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1e430 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1e440 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1e450 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1e460 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1e470 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1e480 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1e490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e4a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1e4b0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1e4c0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1e4d0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1e4e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e4f0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1e500 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1e510 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1e520 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1e530 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1e540 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1e550 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1e560 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1e570 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1e580 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1e590 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1e5a0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1e5b0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1e5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1e5d0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1e5e0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1e5f0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1e600 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1e610 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1e620 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1e630 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1e640 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1e650 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1e660 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1e670 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1e680 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1e690 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1e6a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e6b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1e6c0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1e6d0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1e6e0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1e6f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e700 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1e710 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1e720 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1e730 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1e740 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1e750 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1e760 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1e770 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1e780 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1e790 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1e7a0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1e7b0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1e7c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1e7d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1e7e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1e7f0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1e800 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1e810 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1e820 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1e830 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1e840 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1e850 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1e860 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1e870 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1e880 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1e890 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e8a0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1e8b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1e8c0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1e8d0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1e8e0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1e8f0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1e900 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1e910 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1e920 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1e930 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1e940 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1e950 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1e960 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1e970 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1e980 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1e990 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1e9a0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1e9b0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1e9c0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1e9d0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1e9e0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1e9f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1ea00 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1ea10 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1ea20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1ea30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ea40 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ea50 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1ea60 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1ea70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ea80 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1ea90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1eaa0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1eab0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1eac0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1ead0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1eae0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1eaf0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1eb00 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1eb10 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1eb20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1eb30 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1eb40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eb50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1eb60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1eb70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1eb80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1eb90 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1eba0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1ebb0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ebc0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1ebd0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1ebe0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1ebf0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1ec00 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ec10 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1ec20 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1ec30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1ec40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ec50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ec60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ec70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ec80 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1ec90 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1eca0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1ecb0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1ecc0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1ecd0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1ece0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1ecf0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1ed00 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1ed10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ed20 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1ed30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1ed40 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1ed50 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1ed60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ed70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ed80 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1ed90 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1eda0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1edb0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1edc0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1edd0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1ede0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1edf0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1ee00 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1ee10 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1ee20 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1ee30 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1ee40 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1ee50 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1ee60 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1ee70 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1ee80 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ee90 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1eea0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1eeb0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1eec0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1eed0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1eee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1eef0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1ef00 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1ef10 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1ef20 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1ef30 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ef40 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1ef50 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1ef60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ef70 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1ef80 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1ef90 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1efa0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1efb0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1efc0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1efd0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1efe0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1eff0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1f000 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1f010 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1f020 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1f030 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1f040 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1f050 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1f060 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1f070 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1f080 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1f090 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1f0a0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f0b0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1f0c0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1f0d0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1f0e0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1f0f0 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1f100 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1f110 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1f120 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1f130 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1f140 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1f150 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1f160 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1f170 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1f180 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1f190 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
1f1a0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
1f1b0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
1f1c0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1f1d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f1e0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1f1f0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1f200 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
1f210 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
1f220 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1f230 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
1f240 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1f250 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
1f260 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
1f270 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
1f280 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
1f290 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f2a0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1f2b0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1f2c0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1f2d0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1f2e0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1f2f0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1f300 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1f310 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1f320 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1f330 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1f340 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1f350 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1f360 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1f370 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1f380 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1f390 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1f3a0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1f3b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1f3c0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1f3d0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1f3e0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1f3f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1f400 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1f410 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1f420 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1f430 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1f440 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1f450 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1f460 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1f470 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1f480 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1f490 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1f4a0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1f4b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1f4c0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1f4d0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1f4e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1f4f0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1f500 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1f510 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1f520 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1f530 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1f540 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1f550 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1f560 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f570 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1f580 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1f590 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1f5a0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1f5b0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1f5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1f5d0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1f5e0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1f5f0 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1f600 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1f610 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1f620 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1f630 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1f640 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1f650 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1f660 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1f670 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1f680 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1f690 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1f6a0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1f6b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1f6c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f6d0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1f6e0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1f6f0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1f700 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1f710 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1f720 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1f730 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1f740 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1f750 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1f760 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1f770 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1f780 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1f790 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1f7a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1f7b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1f7c0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1f7d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1f7e0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1f7f0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1f800 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1f810 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1f820 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1f830 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1f840 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1f850 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1f860 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1f870 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f880 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1f890 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1f8a0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1f8b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f8c0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1f8d0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1f8e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f8f0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1f900 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1f910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1f920 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1f930 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1f940 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1f950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f960 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
1f970 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
1f980 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
1f990 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
1f9a0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
1f9b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1f9c0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1f9d0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1f9e0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1f9f0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1fa00 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1fa10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1fa20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fa30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fa40 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1fa50 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1fa60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1fa70 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1fa80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1fa90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1faa0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1fab0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1fac0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1fad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1faf0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1fb00 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1fb10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1fb20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1fb30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fb40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1fb50 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1fb60 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1fb70 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1fb80 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1fb90 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1fba0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
1fbb0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
1fbc0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
1fbd0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
1fbe0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
1fbf0 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
1fc00 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
1fc10 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
1fc20 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
1fc30 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1fc40 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
1fc50 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
1fc60 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1fc70 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
1fc80 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
1fc90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1fca0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1fcb0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
1fcc0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1fcd0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1fce0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1fcf0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1fd00 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
1fd10 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
1fd20 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
1fd30 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
1fd40 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
1fd50 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
1fd60 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
1fd70 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
1fd80 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
1fd90 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
1fda0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
1fdb0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
1fdc0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
1fdd0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
1fde0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
1fdf0 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
1fe00 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
1fe10 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
1fe20 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
1fe30 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1fe40 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
1fe50 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
1fe60 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
1fe70 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
1fe80 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
1fe90 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
1fea0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
1feb0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
1fec0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
1fed0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
1fee0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
1fef0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
1ff00 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
1ff10 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1ff20 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
1ff30 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
1ff40 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
1ff50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1ff60 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
1ff70 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
1ff80 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
1ff90 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
1ffa0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1ffb0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
1ffc0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
1ffd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1ffe0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
1fff0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
20000 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
20010 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
20020 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
20030 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
20040 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
20050 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
20060 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
20070 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
20080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
20090 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
200a0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
200b0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
200c0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
200d0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
200e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
200f0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
20100 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
20110 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
20120 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
20130 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
20140 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20  f( writeOnly && 
20150 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  (p->curFlags & B
20160 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
20170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
20180 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
20190 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65  OR_VALID || p->e
201a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
201b0 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20  IPNEXT ){.      
201c0 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
201d0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
201e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
201f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20200 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
20210 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69  )sqlite3BtreeTri
20220 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72  pAllCursors(pBtr
20230 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  ee, rc, 0);.    
20240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20250 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20260 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
20270 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20280 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
20290 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  r(p);.        p-
202a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
202b0 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20  _FAULT;.        
202c0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
202d0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  rCode;.      }. 
202e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
202f0 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
20300 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
20310 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
20320 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ]);.        p->a
20330 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
20340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20350 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20360 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
20370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20380 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
20390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
203a0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
203b0 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20   If tripCode is 
203c0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68  not SQLITE_OK th
203d0 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  en cursors will 
203e0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28  be invalidated (
203f0 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c  tripped)..** Onl
20400 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
20410 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77  are tripped if w
20420 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65  riteOnly is true
20430 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73   but all cursors
20440 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20   are.** tripped 
20450 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
20460 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65  false.  Any atte
20470 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20  mpt to use.** a 
20480 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77  tripped cursor w
20490 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
204a0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
204b0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
204c0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
204d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
204e0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
204f0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
20500 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
20510 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
20520 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
20530 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
20540 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69  back(Btree *p, i
20550 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74  nt tripCode, int
20560 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69   writeOnly){.  i
20570 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
20580 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20590 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
205a0 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77  e1;..  assert( w
205b0 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77  riteOnly==1 || w
205c0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  riteOnly==0 );. 
205d0 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64   assert( tripCod
205e0 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  e==SQLITE_ABORT_
205f0 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70  ROLLBACK || trip
20600 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
20610 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20620 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
20630 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
20650 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65   tripCode = save
20660 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
20670 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
20680 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20  c ) writeOnly = 
20690 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
206a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
206b0 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
206c0 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
206d0 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
206e0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
206f0 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74  , tripCode, writ
20700 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65  eOnly);.    asse
20710 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
20720 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d  K || (writeOnly=
20730 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54  =0 && rc2==SQLIT
20740 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28  E_OK) );.    if(
20750 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
20760 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
20770 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
20780 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
20790 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
207a0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
207b0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
207c0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
207d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
207e0 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
207f0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20800 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
20810 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20830 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
20840 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
20850 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
20860 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
20870 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
20880 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
20890 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
208a0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
208b0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
208c0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
208d0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
208e0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
208f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
20900 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
20910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20920 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
20930 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
20940 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
20950 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20960 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
20970 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
20980 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
20990 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
209a0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
209b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
209c0 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
209d0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
209e0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
209f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20a00 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
20a10 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
20a20 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
20a30 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
20a40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20a50 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
20a60 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
20a70 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
20a80 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
20a90 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
20aa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20ab0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
20ac0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
20ad0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
20ae0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
20af0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
20b00 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
20b10 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
20b20 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
20b30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
20b40 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
20b50 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
20b60 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
20b70 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
20b80 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
20b90 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
20ba0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
20bb0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
20bc0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
20bd0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
20be0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
20bf0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
20c00 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
20c10 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
20c20 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
20c30 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
20c40 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
20c50 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
20c60 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
20c70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
20c80 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
20c90 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
20ca0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
20cb0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
20cc0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
20cd0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
20ce0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
20cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
20d00 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
20d10 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
20d20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
20d30 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
20d40 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
20d50 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
20d60 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
20d70 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
20d80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
20d90 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
20da0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
20db0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
20dc0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
20dd0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
20de0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
20df0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
20e00 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
20e10 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
20e20 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
20e30 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
20e40 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
20e50 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
20e60 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
20e70 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
20e80 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
20e90 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
20ea0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
20eb0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
20ec0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
20ed0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
20ee0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
20ef0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20f00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20f10 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
20f20 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
20f30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
20f40 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
20f50 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
20f60 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
20f70 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
20f80 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
20f90 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
20fa0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
20fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
20fc0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
20fd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
20fe0 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
20ff0 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
21000 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21010 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
21020 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
21030 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
21040 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
21050 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
21060 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
21070 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
21080 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
21090 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
210a0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
210b0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
210c0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
210d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
210e0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
210f0 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
21100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
21110 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
21120 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
21130 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
21140 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21160 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
21170 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
21180 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
21190 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
211a0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
211b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
211c0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
211d0 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
211e0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
211f0 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
21200 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
21210 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
21220 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
21230 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
21240 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
21250 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
21260 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
21270 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
21280 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
21290 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
212a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
212b0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
212c0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
212d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
212e0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
212f0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
21300 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
21310 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
21320 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
21330 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
21340 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
21350 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
21360 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
21370 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
21380 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
21390 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
213a0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
213b0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
213c0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
213d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
213e0 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
213f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
21400 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
21410 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21420 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
21430 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
21440 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
21450 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
21460 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21470 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
21480 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
21490 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
214a0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
214b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
214c0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
214d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
214e0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
214f0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
21500 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
21510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21520 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
21530 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
21540 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
21550 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
21560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
21570 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
21580 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
21590 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
215a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
215b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
215c0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
215d0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
215e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
215f0 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
21600 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
21610 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
21620 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
21630 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
21640 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
21650 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
21660 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
21670 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
21680 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
21690 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
216a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
216b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
216c0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
216d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
216e0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
216f0 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
21700 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
21710 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
21720 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
21730 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
21740 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
21750 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
21760 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
21770 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
21780 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
21790 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
217a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
217b0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
217c0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
217d0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
217e0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
217f0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
21800 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21810 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
21820 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
21830 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
21840 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
21850 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
21860 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
21870 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
21880 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
21890 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
218a0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
218b0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
218c0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
218d0 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
218e0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
218f0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
21900 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
21910 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
21920 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
21930 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
21940 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
21950 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
21960 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
21970 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21980 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
21990 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
219a0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
219b0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
219c0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
219d0 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
219e0 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
219f0 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
21a00 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
21a10 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
21a20 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
21a30 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
21a40 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
21a50 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
21a60 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
21a70 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
21a80 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
21a90 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21aa0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
21ab0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
21ac0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
21ad0 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
21ae0 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
21af0 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
21b00 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
21b10 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
21b20 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
21b30 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
21b40 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
21b50 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
21b60 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
21b70 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
21b80 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
21b90 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
21ba0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
21bb0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
21bc0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
21bd0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
21be0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
21bf0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
21c00 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
21c10 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
21c20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
21c30 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
21c40 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
21c50 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
21c60 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
21c70 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c90 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
21ca0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
21cd0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
21ce0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
21cf0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d10 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
21d20 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
21d30 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
21d40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
21d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
21d60 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
21d70 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
21d80 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
21d90 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
21da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
21db0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
21dc0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
21dd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21de0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21df0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
21e00 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
21e10 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
21e40 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
21e50 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
21e60 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
21e70 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
21e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
21e90 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
21ea0 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
21eb0 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
21ec0 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
21ed0 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
21ee0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
21ef0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
21f00 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
21f10 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
21f20 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
21f30 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
21f40 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
21f50 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
21f60 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
21f70 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
21f80 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
21f90 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
21fa0 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
21fb0 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
21fc0 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
21fd0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
21fe0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
21ff0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
22000 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
22010 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
22020 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
22030 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22040 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
22050 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
22060 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
22070 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
22080 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
22090 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
220a0 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
220b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
220c0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
220d0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
220e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
220f0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
22100 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
22110 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
22120 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
22130 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22140 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
22150 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
22160 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
22170 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
22180 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
22190 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
221a0 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
221b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
221c0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
221d0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
221e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
221f0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
22200 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
22210 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
22220 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
22230 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
22240 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
22250 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
22260 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
22270 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
22280 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
22290 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
222a0 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
222b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
222c0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
222d0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
222e0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
222f0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
22300 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
22310 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
22320 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
22330 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
22340 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
22350 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
22360 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
22370 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
22380 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
22390 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
223a0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
223b0 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
223c0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
223d0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
223e0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
223f0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
22400 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
22410 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
22420 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
22430 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22440 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
22450 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
22460 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
22470 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22480 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
22490 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
224a0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
224b0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
224c0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
224d0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
224e0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
224f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
22500 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
22510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
22520 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
22530 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
22540 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
22570 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
22580 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
225b0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
225c0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
225d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
22600 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
22610 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
22620 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22640 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
22650 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
22660 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22690 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
226a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
226b0 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
226c0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
226d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
226e0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
226f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
22700 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
22710 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
22720 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
22730 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
22740 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
22750 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
22760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22770 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
22780 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
22790 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
227a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
227b0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
227c0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
227d0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
227e0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
227f0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
22800 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
22810 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
22820 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
22830 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
22840 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
22850 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
22860 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
22870 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
22880 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
22890 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
228a0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
228b0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
228c0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
228d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
228e0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
228f0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
22900 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
22910 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
22920 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
22930 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
22940 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
22950 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
22960 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
22970 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
22980 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
22990 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
229a0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
229b0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
229c0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
229d0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
229e0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
229f0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
22a00 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
22a10 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
22a20 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
22a30 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
22a40 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
22a50 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
22a60 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
22a70 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
22a80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
22a90 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
22aa0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
22ab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22ac0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
22ad0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
22ae0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
22af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22b00 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
22b10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
22b20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
22b30 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
22b40 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
22b50 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
22b60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
22b70 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
22b80 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22b90 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
22ba0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
22bb0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61  sor(pCur);.    a
22bc0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
22bd0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
22be0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
22bf0 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
22c00 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
22c10 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
22c20 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
22c30 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
22c40 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
22c50 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
22c60 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
22c70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
22c80 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
22c90 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
22ca0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22cc0 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
22cd0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
22ce0 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
22cf0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) );.    }.    f
22d00 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
22d10 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
22d20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22d30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
22d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
22d50 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
22d60 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
22d70 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
22d80 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20  erflow);.    /* 
22d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
22da0 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
22db0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
22dc0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
22dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22de0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
22df0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
22e00 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
22e10 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
22e20 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
22e30 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
22e40 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
22e50 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
22e60 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
22e70 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
22e80 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
22e90 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
22ea0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
22eb0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
22ec0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
22ed0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
22ee0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
22ef0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
22f00 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
22f10 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
22f20 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
22f30 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
22f40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
22f50 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
22f60 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
22f70 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
22f80 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
22f90 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
22fa0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
22fb0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
22fc0 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
22fd0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
22fe0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
22ff0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
23000 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
23010 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
23020 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
23030 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
23040 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
23050 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
23060 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
23070 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
23080 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
23090 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
230a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
230b0 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
230c0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
230d0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
230e0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
230f0 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
23100 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
23110 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
23120 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
23130 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
23140 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23150 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23160 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
23170 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
23180 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
23190 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
231a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
231b0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
231c0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
231d0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
231e0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
231f0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
23200 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
23210 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
23220 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
23230 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
23240 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
23250 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
23260 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
23270 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
23280 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
23290 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
232a0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
232b0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
232c0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
232d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
232e0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
232f0 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
23300 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
23310 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
23320 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
23330 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
23340 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
23350 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
23360 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
23370 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
23380 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
23390 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
233a0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
233b0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
233c0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
233d0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
233e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
233f0 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
23400 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
23410 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
23420 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
23430 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
23440 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
23450 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
23460 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
23470 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
23480 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
23490 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
234a0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
234b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
234c0 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
234d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
234e0 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
234f0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23500 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23510 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23520 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23530 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
23540 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
23550 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
23560 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53  nKey;.  return S
23570 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
23580 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
23590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
235a0 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
235b0 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
235c0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
235d0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
235e0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
235f0 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
23600 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
23610 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
23620 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
23630 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
23640 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
23650 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
23660 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
23670 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
23680 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
23690 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
236a0 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
236b0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
236c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
236d0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
236e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
236f0 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
23700 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
23710 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
23720 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
23730 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
23740 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
23750 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
23760 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
23770 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23780 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
23790 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
237a0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
237b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
237c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
237d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
237e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
237f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23800 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
23810 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
23820 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
23830 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
23840 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23850 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23860 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b  intKeyLeaf==1 );
23870 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
23880 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
23890 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
238a0 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
238b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
238c0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
238d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
238e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
238f0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
23900 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
23910 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
23920 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
23930 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
23940 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
23950 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
23960 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
23970 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
23980 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
23990 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
239a0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
239b0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
239c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
239d0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
239e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
239f0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
23a00 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
23a10 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
23a20 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
23a30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23a40 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
23a50 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
23a60 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
23a70 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
23a80 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
23a90 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
23aa0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
23ab0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
23ac0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
23ad0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
23ae0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
23af0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
23b00 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
23b10 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
23b20 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
23b30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
23b40 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
23b50 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
23b60 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
23b70 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
23b80 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
23b90 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
23ba0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
23bb0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
23bc0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
23bd0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
23be0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
23bf0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
23c00 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
23c10 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
23c20 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
23c30 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
23c40 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
23c50 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
23c60 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
23c70 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
23c80 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
23c90 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
23ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23cb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
23cc0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
23cf0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
23d00 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
23d10 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
23d20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
23d30 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
23d40 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
23d50 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
23d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23d70 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
23d80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
23d90 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
23da0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
23db0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
23dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23dd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23de0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
23df0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
23e00 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
23e10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
23e20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
23e30 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
23e40 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
23e50 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
23e60 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
23e70 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
23e80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
23e90 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
23ea0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
23eb0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
23ec0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
23ed0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
23ee0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
23ef0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
23f00 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
23f10 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
23f20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
23f30 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
23f40 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
23f50 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
23f60 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
23f70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
23f80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
23f90 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
23fa0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
23fb0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
23fc0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
23fd0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
23fe0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
23ff0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
24000 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
24010 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
24020 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
24030 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
24040 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24050 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
24060 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
24070 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
24080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24090 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
240a0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
240b0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
240c0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
240d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
240e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
240f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
24100 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
24110 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
24120 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
24130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24140 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
24150 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24160 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
24170 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
24180 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
24190 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
241a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
241b0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
241c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
241d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
241e0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
241f0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
24200 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
24210 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
24220 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
24230 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
24240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
24250 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
24260 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24270 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
24280 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
24290 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
242a0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
242b0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
242c0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
242d0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
242e0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
242f0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
24300 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
24310 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
24320 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
24330 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
24340 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
24350 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
24360 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
24370 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
24380 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
24390 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
243a0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
243b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
243c0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
243d0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
243e0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
243f0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
24400 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
24410 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
24420 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24430 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
24440 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
24450 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
24460 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
24470 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
24480 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
24490 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
244a0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
244b0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
244c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
244d0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
244e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24510 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
24520 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
24530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
24540 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
24550 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
24560 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
24570 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
24580 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
24590 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
245a0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
245b0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
245c0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
245d0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
245e0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
245f0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
24600 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
24610 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24630 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24640 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
24650 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
24660 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24670 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
24680 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
24690 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
246a0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
246b0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
246c0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
246d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
246e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
246f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24700 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
24710 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
24720 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
24730 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
24740 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
24750 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24760 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
24770 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
24780 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
24790 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
247a0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
247b0 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
247c0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
247d0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
247e0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
247f0 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
24800 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
24810 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
24820 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
24830 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
24840 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
24850 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
24860 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
24870 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
24880 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
24890 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
248a0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
248b0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
248c0 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
248d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
248e0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
248f0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
24900 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
24910 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
24920 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
24930 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
24940 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
24950 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
24960 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
24970 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
24980 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
24990 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
249a0 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
249b0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
249c0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
249d0 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
249e0 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
249f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
24a00 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
24a10 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
24a20 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
24a30 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
24a40 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
24a50 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
24a60 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
24a70 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
24a80 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
24a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
24aa0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
24ab0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
24ac0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
24ad0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
24ae0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
24af0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
24b00 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
24b10 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
24b20 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
24b30 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
24b40 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
24b50 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
24b60 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
24b70 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
24b80 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
24b90 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
24ba0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
24bb0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
24bc0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
24bd0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
24be0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
24bf0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
24c00 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
24c10 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
24c20 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
24c30 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
24c40 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
24c50 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
24c60 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
24c70 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
24c80 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
24c90 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
24ca0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
24cb0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
24cc0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
24cd0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
24ce0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
24cf0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
24d00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
24d10 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
24d20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
24d30 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
24d40 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
24d50 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
24d60 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
24d70 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
24d80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
24d90 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
24da0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
24db0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
24dc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
24dd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24de0 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
24df0 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
24e00 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
24e10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
24e20 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
24e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
24e40 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
24e50 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
24e60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
24e70 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
24e80 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24e90 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
24ea0 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
24eb0 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24ee0 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
24ef0 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
24f00 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
24f10 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
24f20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24f30 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
24f40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24f50 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24f60 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
24f70 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
24f80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24f90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24fa0 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
24fb0 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
24fc0 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
24fd0 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
24fe0 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
24ff0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
25000 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
25010 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
25020 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25030 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25040 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
25050 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
25060 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
25070 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
25080 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
25090 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
250a0 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f  ;..  if( &aPaylo
250b0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
250c0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
250d0 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
250e0 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a  eSize] ){.    /*
250f0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
25100 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
25110 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
25120 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
25130 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25140 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25150 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
25160 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
25170 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
25180 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
25190 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
251a0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
251b0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
251c0 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
251d0 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
251e0 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
251f0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
25200 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
25210 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
25220 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
25230 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
25240 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
25250 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30  f, a, (eOp & 0x0
25260 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  1), pPage->pDbPa
25270 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
25280 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
25290 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
252a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
252b0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
252c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
252d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
252e0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
252f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
25300 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
25310 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
25320 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
25330 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
25340 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
25350 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
25360 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
25370 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
25380 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
25390 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
253a0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
253b0 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
253c0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
253d0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
253e0 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
253f0 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
25400 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
25410 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
25420 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
25430 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
25440 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
25450 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
25460 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
25470 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
25480 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
25490 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
254a0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
254b0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
254c0 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
254d0 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
254e0 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
254f0 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
25500 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
25510 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
25520 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
25530 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
25540 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
25550 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
25560 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
25570 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
25580 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
25590 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
255a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
255b0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
255c0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
255d0 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
255e0 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
255f0 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
25600 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
25610 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
25620 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
25630 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
25640 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
25650 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
25660 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
25670 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25680 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
25690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
256a0 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f   pCur->nOvflAllo
256b0 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20  c = nOvfl*2;.   
256c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
256d0 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
256e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
256f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25710 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
25720 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
25730 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
25740 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ));.        pCur
25750 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25760 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
25770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25780 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
25790 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
257a0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
257b0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
257c0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
257d0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
257e0 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
257f0 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
25800 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
25810 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
25820 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
25830 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
25840 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20  idOvfl)!=0.     
25850 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
25860 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
25870 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze].    ){.     
25880 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
25890 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
258a0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
258b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
258c0 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
258d0 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
258e0 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
258f0 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
25900 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
25910 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
25920 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
25930 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
25940 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
25950 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25960 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
25970 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25980 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
25990 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
259a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76  ssert( pCur->aOv
259b0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a  erflow[iIdx]==0.
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259d0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
259e0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
259f0 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
25a00 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
25a10 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   );.        pCur
25a20 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25a30 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
25a40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
25a50 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
25a60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
25a70 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
25a80 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
25a90 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
25aa0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
25ab0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
25ac0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
25ad0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
25ae0 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
25af0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
25b00 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
25b10 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
25b20 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
25b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
25b40 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
25b50 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
25b60 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
25b70 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
25b80 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
25b90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
25ba0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
25bb0 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  t the aOverflow[
25bc0 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20  ] array must be 
25bd0 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73  allocated becaus
25be0 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20  e eOp!=2.       
25bf0 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f   ** here.  If eO
25c00 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65  p==2, then offse
25c10 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72  t==0 and this br
25c20 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
25c30 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ken..        */.
25c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25c50 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20  eOp!=2 );.      
25c60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25c70 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25c80 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
25c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25ca0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
25cb0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
25cc0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
25cd0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
25ce0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
25cf0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
25d00 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
25d10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25d20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
25d30 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
25d40 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
25d50 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
25d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
25d70 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
25d80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25d90 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
25da0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
25db0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
25dc0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
25dd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
25de0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
25df0 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
25e00 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
25e10 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
25e20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
25e30 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25e40 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
25e50 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
25e60 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
25e70 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
25e80 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
25e90 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
25ea0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
25eb0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
25ec0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
25ed0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25ee0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
25ef0 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
25f00 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
25f10 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
25f20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
25f30 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
25f40 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
25f50 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
25f60 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
25f70 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
25f80 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
25f90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
25fa0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
25fb0 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
25fc0 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
25fd0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
25fe0 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
25ff0 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
26000 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
26010 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
26020 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
26030 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
26040 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
26050 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
26060 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
26070 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
26080 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34     7) at least 4
26090 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
260a0 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
260b0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
260c0 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
260d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
260e0 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
260f0 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
26100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26110 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
26120 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
26130 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
26140 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
26150 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
26160 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
26170 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
26180 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
26190 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
261a0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
261b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
261c0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
26200 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
26210 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26240 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
26250 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
26260 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
26290 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
262a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
262b0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262d0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
262e0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
262f0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
26300 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
26310 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
26320 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
26330 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
26340 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
26370 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
26380 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20           /* (7) 
263b0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
263c0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
263d0 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
263e0 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
263f0 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
26400 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
26410 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28        /* hence (
26440 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  7) */.          
26450 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
26460 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
26470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26480 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
26490 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
264a0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
264b0 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
264c0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
264d0 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
264e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
264f0 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
26500 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
26510 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
26520 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
26530 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
26540 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26550 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
26560 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
26570 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
26580 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
26590 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30    ((eOp&0x01)==0
265a0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
265b0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
265c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
265d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
265e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
265f0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
26600 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
26610 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
26620 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
26630 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
26640 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
26650 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
26660 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
26670 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
26680 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44  , (eOp&0x01), pD
26690 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
266a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
266b0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
266c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
266d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
266e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
266f0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
26700 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
26710 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
26720 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26730 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
26740 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
26750 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26760 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
26770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26780 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
26790 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
267a0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
267b0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
267c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
267d0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
267e0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
267f0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
26800 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
26810 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
26820 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
26830 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
26840 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
26850 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
26860 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
26870 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
26880 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
26890 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
268a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
268b0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
268c0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
268d0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
268e0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
268f0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
26900 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26910 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
26920 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
26930 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
26940 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
26950 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26960 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26970 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26980 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26990 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
269a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
269b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
269c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
269d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
269e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
269f0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
26a00 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
26a10 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
26a20 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
26a30 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
26a40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
26a50 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
26a60 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
26a70 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
26a80 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
26a90 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
26aa0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
26ab0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
26ac0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
26ad0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
26ae0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
26af0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
26b00 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
26b10 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
26b20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
26b30 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
26b40 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
26b50 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
26b60 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
26b70 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
26b80 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
26b90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26ba0 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
26bb0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
26bc0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
26bd0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
26be0 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
26bf0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
26c00 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
26c10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
26c20 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
26c30 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
26c40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
26c50 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26c60 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26c70 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
26c80 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
26c90 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
26ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26cb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
26cc0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26cd0 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
26ce0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
26cf0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
26d00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
26d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
26d20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26d30 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
26d40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26d50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
26d60 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
26d70 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
26d80 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
26d90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
26db0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
26dc0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
26dd0 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
26de0 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
26df0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
26e00 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
26e10 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
26e20 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
26e30 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20  he key if index 
26e40 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
26e50 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73  ntKey==0) and is
26e60 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a   the data for.**
26e70 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70   table btrees (p
26e80 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29  Page->intKey==1)
26e90 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  . The number of 
26ea0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
26eb0 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69  le.** key/data i
26ec0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
26ed0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
26ee0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
26ef0 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  ue.** returned w
26f00 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c  ill not be a val
26f10 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
26f20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
26f30 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
26f40 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
26f50 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
26f60 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
26f70 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
26f80 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
26f90 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
26fa0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
26fb0 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
26fc0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
26fd0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
26fe0 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
26ff0 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
27000 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
27010 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
27020 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
27030 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
27040 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
27050 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
27060 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
27070 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
27080 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
27090 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
270a0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
270b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
270c0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
270d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
270e0 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
270f0 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
27100 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
27110 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
27120 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
27130 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
27140 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
27150 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
27160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
27170 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79  t void *fetchPay
27180 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
27190 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
271a0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
271b0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
271c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a   from */.  u32 *
271d0 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20  pAmt            
271e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
271f0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
27200 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29   bytes here */.)
27210 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61  {.  u32 amt;.  a
27220 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
27230 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
27240 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
27250 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
27260 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27270 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27280 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
27290 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
272a0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
272b0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
272c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
272d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
272e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
272f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27300 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27310 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27320 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
27330 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27340 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
27350 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27360 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
27370 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27380 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
27390 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
273a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
273b0 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
273c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
273d0 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
273e0 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
273f0 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
27400 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27410 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
27420 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27430 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
27440 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
27450 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
27460 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
27470 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
27480 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
27490 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
274a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
274b0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
274c0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
274d0 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
274e0 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
274f0 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
27500 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
27510 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
27520 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
27530 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
27540 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27550 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
27560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
27570 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
27580 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
27590 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
275a0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
275b0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
275c0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
275d0 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
275e0 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
275f0 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
27600 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
27610 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
27620 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
27630 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
27640 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
27650 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
27660 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
27670 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
27680 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
27690 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
276a0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
276b0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
276c0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
276d0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
276e0 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
276f0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
27700 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
27710 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
27720 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
27730 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
27740 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
27750 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
27760 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
27770 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27780 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
27790 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
277a0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
277b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
277c0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
277d0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
277e0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
277f0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
27800 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
27810 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
27820 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
27830 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
27840 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
27850 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
27860 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
27870 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
27880 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
27890 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
278a0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
278b0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
278c0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
278d0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
278e0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
278f0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
27900 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
27910 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
27920 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
27930 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27940 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
27950 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
27960 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
27970 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27980 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27990 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
279a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
279b0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
279c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
279d0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
279e0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
279f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
27a00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
27a10 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
27a20 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
27a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27a40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27a50 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  }.  pCur->info.n
27a60 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
27a70 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
27a80 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
27a90 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
27aa0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
27ab0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
27ac0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b  Cur->iPage] = 0;
27ad0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64  .  return getAnd
27ae0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
27af0 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70  wPgno, &pCur->ap
27b00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27b10 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
27b20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c             pCur,
27b30 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
27b40 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51  lags);.}..#if SQ
27b50 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
27b60 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
27b70 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
27b80 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
27b90 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
27ba0 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
27bb0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
27bc0 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
27bd0 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
27be0 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
27bf0 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
27c00 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
27c10 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
27c20 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
27c30 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
27c40 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
27c50 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
27c60 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
27c70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
27c80 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
27c90 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
27ca0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
27cb0 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
27cc0 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52  ild){.  if( CORR
27cd0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
27ce0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69    /* The conditi
27cf0 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77  ons tested below
27d00 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72   might not be tr
27d10 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
27d30 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
27d40 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73  atabase */.  ass
27d50 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
27d60 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
27d70 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
27d80 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
27d90 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
27da0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
27db0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
27dc0 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
27dd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
27de0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
27df0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
27e00 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
27e10 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
27e20 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
27e30 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
27e40 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
27e50 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
27e60 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
27e70 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
27e80 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
27e90 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
27ea0 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
27eb0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
27ec0 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
27ed0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
27ee0 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
27ef0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
27f00 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
27f10 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
27f20 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
27f30 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
27f40 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
27f50 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
27f60 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
27f70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
27f80 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
27f90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27fa0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27fb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27fc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27fd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
27fe0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
27ff0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
28000 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
28010 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
28020 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
28030 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28040 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
28050 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28060 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
28070 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28080 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
28090 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
280a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
280b0 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
280c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
280d0 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
280e0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
280f0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
28100 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28110 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28120 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28130 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
28140 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
28150 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
28160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
28170 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
28180 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
28190 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
281a0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
281b0 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
281c0 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
281d0 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
281e0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
281f0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
28200 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
28210 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
28220 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
28230 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
28240 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
28250 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
28260 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
28270 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
28280 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
28290 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
282a0 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
282b0 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
282c0 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
282d0 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
282e0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
282f0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
28300 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
28310 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
28320 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
28330 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
28340 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
28350 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
28360 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
28370 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
28380 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
28390 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
283a0 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
283b0 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
283c0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
283d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
283e0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
283f0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
28400 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
28410 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
28420 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
28430 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
28440 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
28450 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
28460 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
28470 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
28480 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
28490 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
284a0 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
284b0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
284c0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
284d0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
284e0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
284f0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
28500 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
28510 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
28520 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
28530 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
28540 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
28550 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
28560 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
28570 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
28580 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
28590 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
285a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
285b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
285c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
285d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
285e0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
285f0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28600 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
28610 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
28620 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28630 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
28640 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
28650 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28660 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
28670 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
28680 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
28690 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
286a0 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
286b0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
286c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
286d0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
286e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
286f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
28700 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
28710 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28720 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
28730 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
28740 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
28750 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
28760 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
28770 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
28780 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Page ){.      as
28790 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
287a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21  ge[pCur->iPage]!
287b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  =0 );.      rele
287c0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
287d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
287e0 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
287f0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
28800 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
28810 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
28820 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
28830 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72  VALID;.    retur
28840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28850 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
28860 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
28870 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  -1) );.    rc = 
28880 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
28890 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
288a0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
288b0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
288c0 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0],.            
288d0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
288e0 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
288f0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
28900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28910 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
28920 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
28930 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
28940 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
28950 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
28960 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
28970 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ey = pCur->apPag
28980 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  e[0]->intKey;.  
28990 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
289a0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
289b0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
289c0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
289d0 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
289e0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
289f0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
28a00 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
28a10 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
28a20 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
28a30 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
28a40 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
28a50 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
28a60 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
28a70 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
28a80 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
28a90 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
28aa0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
28ab0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
28ac0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
28ad0 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
28ae0 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
28af0 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
28b00 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
28b10 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
28b20 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
28b30 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
28b40 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
28b50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
28b60 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
28b70 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
28b80 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
28b90 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
28ba0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
28bb0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
28bc0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
28bd0 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
28be0 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
28bf0 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
28c00 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
28c10 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
28c20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
28c30 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
28c40 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
28c50 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
28c60 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
28c70 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
28c80 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
28c90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28ca0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28cb0 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49    }..  pCur->aiI
28cc0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
28cd0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
28ce0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
28cf0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
28d00 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
28d10 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
28d20 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  fl);..  if( pRoo
28d30 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
28d40 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
28d50 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
28d60 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
28d70 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
28d80 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
28d90 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
28da0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
28db0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28dc0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
28dd0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
28de0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
28df0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
28e00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28e10 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
28e20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
28e30 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
28e40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28e50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
28e60 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
28e70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28e80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
28e90 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
28ea0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
28eb0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
28ec0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
28ed0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
28ee0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
28ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
28f00 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
28f10 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
28f20 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
28f30 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
28f40 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
28f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28f60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
28f70 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
28f80 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
28f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28fa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28fb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
28fc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28fd0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28fe0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28ff0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29000 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
29010 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
29020 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29030 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
29040 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
29050 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
29060 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
29070 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
29080 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
29090 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
290a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
290b0 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
290c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
290d0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
290e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
290f0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
29100 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
29110 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
29120 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
29130 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
29140 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
29150 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
29160 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
29170 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
29180 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
29190 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
291a0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
291b0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
291c0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
291d0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
291e0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
291f0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
29200 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
29210 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29220 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
29230 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
29240 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
29250 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
29260 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
29270 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
29280 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
29290 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
292a0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
292b0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
292c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
292d0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
292e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
292f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
29300 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
29310 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
29320 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29330 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29340 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29350 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
29360 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29370 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
29380 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
29390 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
293a0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
293b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
293c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
293d0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
293e0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
293f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
29400 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
29410 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29420 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
29430 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29440 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
29450 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28  ell-1;.  assert(
29460 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29470 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
29480 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
29490 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
294a0 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ey)==0 );.  retu
294b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
294c0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
294d0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
294e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
294f0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
29500 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
29510 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
29520 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
29530 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
29540 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
29550 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
29560 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
29570 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
29580 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
29590 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
295a0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
295b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
295c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
295d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
295e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
295f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
29600 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
29610 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
29620 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
29630 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
29640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
29650 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29660 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
29670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29680 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
29690 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
296a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
296b0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
296c0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
296d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
296e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
296f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29700 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
29710 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
29720 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
29730 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
29740 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29750 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
29760 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
29770 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
29780 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
29790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
297a0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
297b0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
297c0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
297d0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
297e0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
297f0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
29800 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
29810 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
29820 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
29830 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
29840 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
29850 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
29860 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29870 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29880 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29890 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
298a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
298b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
298c0 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
298d0 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
298e0 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
298f0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
29900 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
29910 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70  ur->eState && (p
29920 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
29930 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
29940 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
29950 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
29960 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
29970 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
29980 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
29990 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
299a0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
299b0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
299c0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
299d0 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
299e0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
299f0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
29a00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29a10 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
29a20 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
29a30 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
29a40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
29a50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
29a60 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
29a70 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29a80 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
29a90 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
29aa0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
29ab0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
29ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29ad0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
29ae0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
29af0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
29b10 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
29b20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
29b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29b40 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
29b50 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
29b60 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
29b70 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
29b80 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
29b90 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
29ba0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
29bb0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
29bc0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29bd0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
29be0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
29bf0 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ur);.      if( r
29c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29c10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
29c20 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41  rFlags |= BTCF_A
29c30 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  tLast;.      }el
29c40 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72  se{.        pCur
29c50 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
29c60 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
29c70 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20    }.   .    }.  
29c80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29c90 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
29ca0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
29cb0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
29cc0 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
29cd0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
29ce0 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
29cf0 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
29d00 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
29d10 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
29d20 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
29d30 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
29d40 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
29d50 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
29d60 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
29d70 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
29d80 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
29d90 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
29da0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
29db0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
29dc0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
29dd0 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
29de0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
29df0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
29e00 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
29e10 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
29e20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
29e30 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
29e40 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
29e50 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
29e60 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
29e70 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
29e80 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
29e90 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
29ea0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
29eb0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
29ec0 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
29ed0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
29ee0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
29ef0 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
29f00 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
29f10 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
29f20 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
29f30 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
29f40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
29f50 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
29f60 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
29f70 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
29f80 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
29f90 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
29fa0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
29fb0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
29fc0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
29fd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
29fe0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
29ff0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
2a000 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
2a010 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
2a020 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
2a030 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a040 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a050 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2a080 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2a090 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
2a0a0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2a0b0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2a0c0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2a0d0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2a0e0 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
2a0f0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2a100 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
2a110 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2a120 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
2a130 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2a140 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2a150 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
2a160 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
2a170 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
2a180 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
2a190 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
2a1a0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
2a1b0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2a1c0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
2a1d0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
2a1e0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
2a1f0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
2a200 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
2a210 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a230 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
2a240 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
2a250 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
2a260 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
2a270 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
2a280 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2a290 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2a2a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a2b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a2c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a2d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2a2e0 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
2a2f0 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
2a300 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
2a310 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
2a320 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2a330 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2a340 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2a350 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2a360 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2a370 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2a380 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2a390 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2a3a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a3b0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2a3c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a3d0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2a3e0 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 63  =0.   && pCur->c
2a3f0 75 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  urIntKey .  ){. 
2a400 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2a410 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2a420 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2a430 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
2a440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2a450 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
2a460 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a470 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43  AtLast)!=0 && pC
2a480 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
2a490 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2a4a0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2a4b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a4c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
2a4d0 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
2a4e0 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2a4f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
2a500 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
2a510 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
2a520 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
2a530 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
2a540 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
2a550 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2a560 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2a570 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
2a580 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2a590 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
2a5a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
2a5b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
2a5c0 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
2a5d0 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
2a5e0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2a5f0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2a600 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2a610 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2a620 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2a630 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2a640 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a650 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
2a660 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a670 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a680 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a690 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
2a6a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a6b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2a6c0 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
2a6d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2a6e0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
2a6f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a700 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
2a710 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
2a720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2a730 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2a740 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2a750 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a760 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
2a770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a780 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2a790 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2a7a0 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49  tKey==pCur->curI
2a7b0 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  ntKey );.  asser
2a7c0 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
2a7d0 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
2a7e0 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
2a7f0 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
2a800 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
2a810 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
2a820 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2a830 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a840 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70  Page];.    u8 *p
2a850 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a870 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
2a880 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
2a890 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
2a8a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
2a8b0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2a8c0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
2a8d0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
2a8e0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
2a8f0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2a900 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
2a910 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
2a920 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
2a930 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
2a940 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
2a950 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
2a960 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
2a970 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
2a980 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
2a990 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
2a9a0 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
2a9b0 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
2a9c0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
2a9d0 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
2a9e0 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
2a9f0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
2aa00 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
2aa10 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
2aa20 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
2aa30 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
2aa40 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2aa50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2aa60 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2aa70 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2aa80 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
2aa90 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
2aaa0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
2aab0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2aac0 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
2aad0 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
2aae0 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
2aaf0 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
2ab00 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
2ab10 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
2ab20 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
2ab30 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  */.    pCur->aiI
2ab40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2ab50 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2ab60 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
2ab70 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
2ab80 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2ab90 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
2aba0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2abb0 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2abc0 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
2abd0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2abe0 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2abf0 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
2ac00 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
2ac10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2ac20 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
2ac30 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75  >aDataEnd ) retu
2ac40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ac50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2ac60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ac70 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
2ac80 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
2ac90 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2aca0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
2acb0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2acc0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2acd0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2ace0 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20  >upr ){ c = -1; 
2acf0 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2ad00 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
2ad10 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key>intKey ){.  
2ad20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2ad30 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x-1;.          i
2ad40 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2ad50 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = +1; break; }. 
2ad60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ad70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ad80 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
2ad90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   );.          pC
2ada0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2adb0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
2adc0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2add0 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2ade0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2adf0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ae00 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2ae10 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2ae20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2ae30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2ae40 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2ae50 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2ae60 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2ae70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ae80 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2ae90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2aea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2aeb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2aec0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2aed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2aee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aef0 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2af00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2af10 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2af20 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2af30 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2af40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2af50 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2af60 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b        int nCell;
2af70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
2af80 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62   pCell cell in b
2af90 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
2afa0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2afb0 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2afc0 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2afd0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
2afe0 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
2aff0 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
2b000 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2b010 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2b020 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2b030 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
2b040 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
2b050 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
2b060 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
2b070 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
2b080 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
2b090 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
2b0a0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
2b0b0 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
2b0c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2b0d0 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
2b0e0 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
2b0f0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
2b100 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
2b110 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
2b120 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
2b130 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
2b140 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
2b150 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
2b160 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
2b170 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
2b180 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
2b190 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
2b1a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b1b0 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
2b1c0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ];.        if( n
2b1d0 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
2b1e0 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a  1bytePayload ){.
2b1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
2b200 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
2b210 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
2b220 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
2b230 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
2b240 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
2b250 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2b260 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
2b270 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2b280 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
2b290 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2b2a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b2b0 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
2b2c0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2b2d0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2b2e0 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2b2f0 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2b300 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
2b310 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2b320 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
2b330 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
2b340 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
2b350 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
2b360 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
2b370 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
2b380 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2b390 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2b3a0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
2b3b0 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
2b3c0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2b3d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
2b3e0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2b3f0 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
2b400 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2b410 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2b420 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
2b430 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2b440 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2b450 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2b460 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2b470 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
2b480 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2b4a0 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
2b4b0 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
2b4c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
2b4d0 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
2b4e0 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
2b4f0 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
2b500 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
2b510 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
2b520 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
2b530 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
2b540 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
2b550 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
2b560 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
2b570 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
2b580 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
2b590 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
2b5a0 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20  lled. .         
2b5b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
2b5c0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
2b5d0 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78  s corrupt, the x
2b5e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f  RecordCompare ro
2b5f0 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20  utine may read. 
2b600 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74           ** up t
2b610 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61  o two varints pa
2b620 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2b630 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74  e buffer. An ext
2b640 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20  ra 18 .         
2b650 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64   ** bytes of pad
2b660 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65  ding is allocate
2b670 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
2b680 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20  the buffer in.  
2b690 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
2b6a0 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a  this happens.  *
2b6b0 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
2b6c0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
2b6d0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
2b6e0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
2b6f0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
2b700 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
2b710 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
2b720 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
2b730 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
2b740 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2b750 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
2b760 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
2b770 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b780 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f  ( nCell<0 );   /
2b790 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69  * True if key si
2b7a0 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f  ze is 2^32 or mo
2b7b0 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
2b7c0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2b7d0 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =0 );  /* Invali
2b7e0 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2b7f0 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20  0 0x80 0x00 */. 
2b800 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b810 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20  e( nCell==1 );  
2b820 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2b830 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2b840 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x01 */.        
2b850 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2b860 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  l==2 );  /* Mini
2b870 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20  mum legal index 
2b880 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  key size */.    
2b890 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2b8a0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2b8b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2b8c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2b8d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b8e0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2b8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b900 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2b910 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2b920 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2b930 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2b940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b950 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2b960 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
2b970 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b980 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2b990 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2b9a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b9b0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2b9c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2b9d0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2b9e0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2b9f0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2ba00 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  Key, 2);.       
2ba10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ba20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ba30 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2ba40 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2ba50 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2ba60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ba70 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2ba80 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2ba90 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2baa0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2bab0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2bac0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2bad0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bae0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2baf0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2bb00 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2bb10 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2bb20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2bb30 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2bb40 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2bb50 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2bb60 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2bb70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2bb80 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2bb90 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2bba0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2bbb0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2bbc0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2bbd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bbe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2bbf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2bc00 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2bc10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bc20 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2bc30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2bc40 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2bc50 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2bc60 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2bc70 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2bc80 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2bc90 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2bca0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2bcb0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
2bcc0 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
2bcd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2bce0 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2bcf0 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2bd00 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2bd10 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
2bd20 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2bd30 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
2bd40 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
2bd50 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2bd60 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
2bd70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2bd80 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
2bd90 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2bda0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2bdb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2bdc0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
2bdd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bde0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2bdf0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2be00 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2be10 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2be20 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2be30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2be40 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2be50 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2be60 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2be70 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2be80 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2be90 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2bea0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2beb0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2bec0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2bed0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2bee0 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2bef0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2bf00 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2bf10 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2bf20 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
2bf30 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2bf40 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2bf50 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2bf60 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2bf70 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2bf80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2bf90 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2bfa0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2bfb0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2bfc0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
2bfd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2bfe0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2bff0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2c000 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
2c010 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2c020 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
2c030 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
2c040 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
2c050 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
2c060 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
2c070 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
2c080 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2c090 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2c0a0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
2c0b0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
2c0c0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
2c0d0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
2c0e0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2c0f0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2c100 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
2c110 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
2c120 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
2c130 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
2c140 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2c150 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
2c160 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
2c170 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
2c180 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
2c190 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
2c1a0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2c1b0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
2c1c0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
2c1d0 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
2c1e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
2c1f0 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
2c200 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
2c210 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
2c220 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
2c230 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
2c240 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
2c250 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
2c260 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
2c270 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
2c280 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
2c290 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
2c2a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2c2b0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2c2c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2c2d0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2c2e0 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2c2f0 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2c300 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2c310 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
2c320 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2c330 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2c340 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2c350 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
2c360 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2c370 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2c380 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2c390 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
2c3a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2c3b0 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2c3c0 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
2c3d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2c3e0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2c3f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2c400 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2c410 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
2c420 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2c430 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2c440 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
2c450 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
2c460 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
2c470 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2c480 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
2c490 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
2c4a0 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
2c4b0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2c4c0 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
2c4d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2c4e0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
2c4f0 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
2c500 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2c510 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
2c520 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
2c530 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
2c540 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
2c550 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
2c560 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
2c570 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
2c580 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
2c590 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
2c5a0 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
2c5b0 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
2c5c0 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
2c5d0 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
2c5e0 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
2c5f0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2c600 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
2c610 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
2c620 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
2c630 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2c640 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
2c650 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
2c660 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2c670 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2c680 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2c690 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c6a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2c6b0 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2c6c0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2c6d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2c6e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2c6f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2c700 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2c710 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2c720 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2c730 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2c740 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2c750 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2c760 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c770 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2c780 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2c790 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2c7a0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2c7b0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2c7c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2c7e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2c7f0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2c800 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2c810 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2c820 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2c830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c840 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2c850 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2c860 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c870 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2c880 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2c890 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2c8a0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2c8b0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2c8c0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2c8d0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2c8e0 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2c8f0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2c900 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2c910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c920 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2c930 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2c940 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2c950 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2c960 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c970 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2c980 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c990 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2c9a0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2c9b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2c9c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2c9d0 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2c9e0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2c9f0 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2ca00 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2ca10 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2ca20 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2ca30 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2ca40 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2ca50 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2ca60 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2ca70 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2ca80 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2ca90 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2caa0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2cab0 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2cac0 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2cad0 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2cae0 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2caf0 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2cb00 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2cb10 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2cb20 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2cb30 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2cb40 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2cb50 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2cb60 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2cb70 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2cb80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2cb90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2cba0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2cbb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2cbc0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2cbd0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2cbe0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2cbf0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2cc00 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2cc10 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2cc20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2cc30 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2cc40 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2cc50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cc60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2cc70 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2cc80 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2cc90 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2cca0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2ccb0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2ccc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2ccd0 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2cce0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2ccf0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2cd00 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2cd10 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2cd20 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2cd30 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2cd40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cd50 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2cd60 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2cd70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cd80 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2cd90 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2cda0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2cdb0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2cdc0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2cdd0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2cde0 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2cdf0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2ce00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2ce10 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ce20 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2ce30 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2ce40 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2ce50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ce60 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2ce70 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ce80 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2ce90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2cea0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2ceb0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2cec0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2ced0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70  ValidOvfl);.  *p
2cee0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
2cef0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2cf00 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2cf10 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2cf20 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67  r, pRes);.  pPag
2cf30 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2cf40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2cf50 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69   if( (++pCur->ai
2cf60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2cf70 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
2cf80 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
2cf90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2cfa0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
2cfb0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2cfc0 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  es);.  }.  if( p
2cfd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2cfe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cff0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2d000 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2d010 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2d020 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
2d030 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2d040 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
2d050 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
2d060 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2d070 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2d080 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2d090 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2d0a0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2d0b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2d0c0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2d0d0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2d0e0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2d0f0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2d100 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2d110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2d120 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2d130 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2d140 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2d150 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2d160 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2d170 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2d180 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2d190 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2d1a0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2d1b0 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2d1c0 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2d1d0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2d1e0 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2d1f0 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2d200 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2d210 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2d220 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2d230 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2d240 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2d250 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2d260 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2d270 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2d280 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2d290 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2d2a0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2d2b0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2d2c0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2d2d0 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2d2e0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2d2f0 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2d300 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2d310 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2d320 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2d330 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2d340 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2d350 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2d360 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2d370 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2d380 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2d390 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2d3a0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2d3b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2d3c0 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2d3d0 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2d3e0 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2d3f0 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2d400 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2d410 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2d420 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2d430 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2d440 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2d450 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2d460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d470 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2d480 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2d490 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2d4a0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2d4b0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2d4c0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2d4d0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2d4e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d4f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d500 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2d510 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d520 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2d530 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2d540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d550 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2d560 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d570 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d580 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2d590 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2d5a0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2d5b0 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2d5c0 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
2d5d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2d5e0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2d5f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2d600 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2d610 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
2d620 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2d630 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2d640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d650 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2d660 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2d670 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2d680 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2d690 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2d6a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2d6b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d6c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2d6d0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2d6e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2d6f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2d700 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2d710 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2d720 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2d730 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2d740 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2d750 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2d760 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
2d770 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2d780 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2d790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2d7b0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2d7c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2d7d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d7e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2d7f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d800 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2d810 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d820 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
2d830 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d840 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
2d850 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2d860 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
2d870 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2d880 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
2d890 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d8a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2d8b0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2d8c0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
2d8d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d8e0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
2d8f0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2d900 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2d910 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2d920 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2d930 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
2d940 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2d950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2d970 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2d980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2d990 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2d9a0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2d9b0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2d9c0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2d9d0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d9e0 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
2d9f0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2da00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2da10 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
2da20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2da30 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
2da40 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2da50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2da60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2da70 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2da80 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2da90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2daa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2dab0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2dac0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2dad0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2dae0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2daf0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61   int *pRes){.  a
2db00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2db10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2db20 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2db30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2db40 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2db50 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2db60 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2db70 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2db80 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2db90 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
2dba0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2dbb0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
2dbc0 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2dbd0 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2dbe0 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  y);.  pCur->info
2dbf0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
2dc00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2dc10 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20  CURSOR_VALID.   
2dc20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  || pCur->aiIdx[p
2dc30 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20  Cur->iPage]==0. 
2dc40 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67    || pCur->apPag
2dc50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2dc60 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
2dc70 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
2dc80 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2dc90 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  );.  }.  pCur->a
2dca0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2dcb0 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ]--;.  return SQ
2dcc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2dcd0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2dce0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
2dcf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2dd00 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
2dd10 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
2dd20 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
2dd30 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
2dd40 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
2dd50 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2dd60 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
2dd70 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
2dd80 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
2dd90 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
2dda0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
2ddb0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
2ddc0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
2ddd0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
2dde0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
2ddf0 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
2de00 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
2de10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2de20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
2de30 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
2de40 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
2de50 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
2de60 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
2de70 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
2de80 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
2de90 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
2dea0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
2deb0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
2dec0 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
2ded0 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
2dee0 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
2def0 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
2df00 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
2df10 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2df20 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
2df30 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
2df40 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
2df50 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
2df60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2df70 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
2df80 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
2df90 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
2dfa0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
2dfb0 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
2dfc0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
2dfd0 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
2dfe0 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
2dff0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
2e000 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
2e010 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2e020 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
2e030 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
2e040 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
2e050 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
2e060 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
2e070 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
2e080 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
2e090 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
2e0a0 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
2e0b0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
2e0c0 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
2e0d0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
2e0e0 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
2e0f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2e100 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
2e110 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
2e120 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2e130 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
2e140 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
2e150 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
2e160 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
2e170 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2e180 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
2e190 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
2e1a0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
2e1b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
2e1c0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
2e1d0 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
2e1e0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
2e1f0 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
2e200 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e220 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
2e230 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
2e240 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
2e250 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2e260 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
2e270 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
2e280 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2e290 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
2e2a0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
2e2b0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
2e2c0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
2e2d0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
2e2e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
2e2f0 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
2e300 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
2e310 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
2e320 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
2e330 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2e340 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2e350 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e360 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2e370 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2e380 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
2e390 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
2e3a0 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
2e3b0 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
2e3c0 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
2e3d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
2e3e0 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
2e3f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
2e400 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2e410 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
2e420 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2e430 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2e440 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
2e450 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
2e460 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2e470 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2e480 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
2e490 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2e4a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2e4b0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2e4c0 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2e4d0 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2e4e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e4f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e500 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2e510 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2e520 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2e530 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2e540 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2e550 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2e560 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2e570 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2e580 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2e590 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2e5a0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2e5b0 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63  /.    u32 nSearc
2e5c0 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e  h = 0;   /* Coun
2e5d0 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
2e5e0 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70  of search attemp
2e5f0 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  ts */.    .    /
2e600 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
2e610 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
2e620 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
2e630 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
2e640 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
2e650 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2e660 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
2e670 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2e680 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
2e690 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
2e6a0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
2e6b0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
2e6c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e6d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e6e0 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
2e6f0 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
2e700 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
2e710 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2e720 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
2e730 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
2e740 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
2e750 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
2e760 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
2e770 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2e780 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
2e790 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
2e7a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e7b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
2e7c0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
2e7d0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2e7e0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2e7f0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
2e800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e810 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
2e820 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
2e830 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2e840 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2e850 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
2e860 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
2e870 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
2e880 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
2e890 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
2e8a0 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
2e8b0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
2e8c0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
2e8d0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
2e8e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e8f0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2e900 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e910 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2e920 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
2e930 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2e940 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
2e950 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
2e960 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
2e970 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
2e980 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
2e990 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
2e9a0 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
2e9b0 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
2e9c0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
2e9d0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
2e9e0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
2e9f0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
2ea00 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
2ea10 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2ea20 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
2ea30 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
2ea40 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
2ea50 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2ea60 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2ea70 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
2ea80 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
2ea90 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
2eaa0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
2eab0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2eac0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2ead0 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
2eae0 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
2eaf0 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2eb00 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2eb10 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
2eb20 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2eb30 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
2eb40 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
2eb50 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
2eb60 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
2eb70 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
2eb80 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2eb90 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2eba0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2ebb0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2ebc0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
2ebd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
2ebe0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
2ebf0 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
2ec00 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2ec10 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2ec20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
2ec30 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
2ec40 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
2ec50 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
2ec60 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
2ec70 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
2ec80 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
2ec90 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
2eca0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2ecb0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2ecc0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
2ecd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2ece0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2ecf0 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
2ed00 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61  k>mxPage || nSea
2ed10 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20  rch++ > n ){.   
2ed20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ed30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ed40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ed50 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2ed60 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
2ed70 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
2ed80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2ed90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2eda0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2edb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
2edc0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2edd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ede0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
2edf0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2ee00 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
2ee10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
2ee20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
2ee30 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73  3523-04394 The s
2ee40 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e  econd integer on
2ee50 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
2ee60 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  k page.      ** 
2ee70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2ee80 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74   leaf page point
2ee90 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a  ers to follow. *
2eea0 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  /.      k = get4
2eeb0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2eec0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
2eed0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
2eee0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
2eef0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
2ef00 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
2ef10 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
2ef20 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
2ef30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
2ef40 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
2ef50 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
2ef60 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
2ef70 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2ef80 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2ef90 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2efa0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2efb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2efc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2efd0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2efe0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2eff0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f000 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f010 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2f020 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2f030 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2f040 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2f050 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2f060 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2f070 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2f080 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2f090 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2f0a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2f0b0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2f0c0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2f0d0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2f0e0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2f0f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f100 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2f110 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2f120 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2f130 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2f140 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2f150 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2f160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2f170 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f180 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2f190 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f1a0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2f1b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2f1c0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2f1d0 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2f1e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2f1f0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2f200 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2f210 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2f220 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2f230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2f240 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2f250 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2f260 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2f270 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2f280 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2f290 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2f2a0 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2f2b0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2f2c0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2f2d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2f2e0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2f2f0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2f300 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2f310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f320 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2f330 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2f340 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f350 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f360 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f380 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2f390 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2f3a0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2f3b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2f3c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2f3d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2f3e0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2f3f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f410 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2f420 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f430 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f450 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f460 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f470 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2f480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f490 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2f4a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2f4b0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2f4c0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2f4d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2f4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2f4f0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2f500 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2f510 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2f520 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2f530 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2f540 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2f550 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2f560 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2f570 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2f580 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2f590 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2f5a0 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2f5b0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2f5c0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2f5d0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2f5e0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2f5f0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
2f600 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
2f610 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
2f620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f630 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f640 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f650 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f660 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2f670 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f680 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
2f690 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2f6a0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2f6b0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
2f6c0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2f6d0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2f6e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f6f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f700 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f710 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f730 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f740 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2f750 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2f760 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2f770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f780 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2f790 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2f7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2f7b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f7c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2f7d0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2f7e0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2f7f0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2f800 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2f810 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2f820 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2f830 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2f840 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2f850 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2f860 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2f870 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2f880 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2f890 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2f8a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2f8b0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2f8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2f8d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2f8e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2f8f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2f900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2f910 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2f920 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2f930 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2f940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f960 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2f970 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2f980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2f990 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f9a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f9b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f9c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f9d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2f9e0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2f9f0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2fa00 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2fa10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2fa30 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2fa40 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2fa50 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2fa60 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2fa70 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2fa80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fa90 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2faa0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2fab0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2fac0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2fad0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2fae0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2faf0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2fb00 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2fb10 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2fb20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2fb30 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2fb40 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2fb50 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2fb60 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2fb70 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2fb80 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2fb90 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2fba0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2fbb0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2fbc0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2fbd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2fbe0 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2fc00 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2fc10 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2fc20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2fc30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2fc40 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2fc50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2fc60 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2fc70 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2fc80 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2fc90 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2fca0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2fcb0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2fcc0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2fcd0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2fce0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2fcf0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2fd00 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2fd10 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2fd20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2fd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fd40 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2fd60 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2fd70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fd80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fd90 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2fda0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2fdb0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2fdc0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2fdd0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2fde0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2fdf0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2fe00 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2fe10 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2fe20 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2fe30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2fe40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fe50 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2fe60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fe70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fe80 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2fe90 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2fea0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2feb0 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2fec0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2fed0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2fee0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2fef0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2ff00 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2ff10 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2ff20 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2ff30 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2ff40 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2ff50 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2ff60 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2ff70 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ff90 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2ffa0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2ffb0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2ffc0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2ffd0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2ffe0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2fff0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30000 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
30010 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30020 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30030 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30040 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30050 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
30060 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
30070 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
30080 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
30090 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
300a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
300b0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
300c0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
300d0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
300e0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
300f0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
30100 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
30110 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
30120 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
30130 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30140 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
30150 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
30160 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30190 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
301a0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
301b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
301c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
301d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
301e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
301f0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
30200 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
30210 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30220 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
30230 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
30240 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
30250 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30270 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
30280 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
30290 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
302a0 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
302b0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
302c0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
302d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
302e0 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
302f0 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
30300 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
30310 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30320 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
30330 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
30340 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
30350 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
30360 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
30370 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
30380 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
30390 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
303a0 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
303b0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
303c0 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
303d0 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
303e0 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
303f0 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
30400 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
30410 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
30420 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
30430 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
30440 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
30450 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
30460 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
30470 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
30480 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
30490 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
304a0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
304b0 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
304c0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
304d0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
304e0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
304f0 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
30500 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
30510 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
30520 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
30530 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
30540 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
30550 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
30560 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
30570 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
30580 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
30590 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
305a0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
305b0 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
305c0 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
305d0 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
305e0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
305f0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
30600 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
30610 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
30620 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
30630 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
30640 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
30650 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
30660 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
30670 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
30680 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
30690 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
306a0 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
306b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
306c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
306d0 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
306e0 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
306f0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f  ->bDoTruncate))?
30700 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
30710 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20  TENT:0;..    rc 
30720 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30730 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
30740 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
30750 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30760 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
30770 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
30780 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
30790 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
307a0 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
307b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
307c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
307d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
307e0 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
307f0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
30800 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
30810 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
30820 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
30830 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
30840 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
30850 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
30860 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30870 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
30880 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
30890 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
308a0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
308b0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
308c0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
308d0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
308e0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
308f0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
30900 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
30910 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
30920 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
30930 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
30940 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
30950 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
30960 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
30970 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
30980 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
30990 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
309a0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
309b0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
309c0 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
309d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
309e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
309f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30a00 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
30a10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30a20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30a30 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
30a40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30a50 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
30a60 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
30a70 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
30a80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30a90 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
30aa0 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
30ab0 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
30ac0 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
30ad0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
30ae0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
30af0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
30b00 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
30b10 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
30b20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30b30 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
30b40 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
30b50 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
30b60 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65  ppPage, bNoConte
30b70 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
30b80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
30b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30ba0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
30bb0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
30bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
30be0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
30bf0 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
30c00 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  = 0;.    }.    T
30c10 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
30c20 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
30c30 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
30c40 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
30c50 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
30c60 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
30c70 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
30c80 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
30c90 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
30ca0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
30cb0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65  evTrunk);.  asse
30cc0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
30cd0 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
30ce0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
30cf0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
30d00 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  )<=1 );.  assert
30d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30d20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  || (*ppPage)->is
30d30 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Init==0 );.  ret
30d40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30d50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30d60 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
30d70 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
30d80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
30d90 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
30da0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
30db0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
30dc0 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
30dd0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
30de0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
30df0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
30e00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
30e10 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
30e20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
30e30 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
30e40 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
30e50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
30e60 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
30e70 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
30e80 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
30e90 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
30ea0 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
30eb0 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
30ec0 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
30ed0 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
30ee0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
30ef0 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
30f00 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
30f10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
30f20 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
30f30 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
30f40 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
30f50 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
30f60 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
30f70 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
30f80 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
30f90 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
30fa0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
30fb0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
30fc0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
30fd0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
30fe0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
30ff0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31000 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31010 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
31020 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
31030 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
31040 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
31050 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
31060 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
31070 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
31080 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310a0 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
310b0 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
310c0 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
310f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
31100 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
31110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31120 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
31130 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
31140 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
31150 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31160 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
31170 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
31180 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
31190 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  || iPage>1 );.  
311a0 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
311b0 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
311c0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
311d0 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72   if( iPage<2 ) r
311e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
311f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28  RUPT_BKPT;.  if(
31200 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
31210 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
31220 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
31230 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
31240 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
31250 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
31260 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
31270 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
31280 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
31290 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
312a0 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
312b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
312c0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
312d0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
312e0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
312f0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
31300 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
31310 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
31320 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
31330 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
31340 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
31350 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
31360 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
31370 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
31380 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
31390 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
313a0 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
313b0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
313c0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
313d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
313e0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
313f0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
31400 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
31410 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
31420 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
31430 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
31440 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
31450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31460 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
31470 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
31480 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31490 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
314a0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
314b0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
314c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
314d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
314e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
314f0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
31500 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
31510 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
31520 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
31530 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
31540 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
31550 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
31560 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
31570 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
31580 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
31590 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
315a0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
315b0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
315c0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
315d0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
315e0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
315f0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
31600 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
31610 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
31620 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
31630 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
31640 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
31650 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
31660 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
31670 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
31680 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
31690 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
316a0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
316b0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
316c0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
316d0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
316e0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
316f0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
31700 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
31710 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
31720 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
31730 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
31740 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
31750 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
31760 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
31770 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
31780 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
31790 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
317a0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
317b0 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
317c0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
317d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
317e0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
317f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
31800 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
31810 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
31820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
31840 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
31860 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
31870 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
31880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
31890 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
318a0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
318b0 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
318c0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
318d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
318e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
318f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
31900 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
31910 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
31920 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
31930 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
31940 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
31950 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
31960 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
31970 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
31980 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
31990 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
319a0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
319b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
319c0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
319d0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
319e0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
319f0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
31a00 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
31a10 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
31a20 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
31a30 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
31a40 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
31a50 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
31a60 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
31a70 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
31a80 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
31a90 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
31aa0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
31ab0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
31ac0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
31ad0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
31ae0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
31af0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
31b00 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
31b10 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
31b20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
31b30 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
31b40 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
31b50 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
31b60 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
31b70 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
31b80 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
31b90 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
31ba0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
31bb0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
31bc0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
31bd0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
31be0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
31bf0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
31c00 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
31c10 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
31c20 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
31c30 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
31c40 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
31c50 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
31c60 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
31c70 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
31c80 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
31c90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
31ca0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
31cb0 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48   R-19920-11576 H
31cc0 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65  owever, newer ve
31cd0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
31ce0 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20   still.      ** 
31cf0 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20  avoid using the 
31d00 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73  last six entries
31d10 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   in the freelist
31d20 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61   trunk page arra
31d30 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  y in.      ** or
31d40 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73  der that databas
31d50 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
31d60 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
31d70 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  s of SQLite can 
31d80 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  be.      ** read
31d90 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
31da0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20  ns of SQLite..  
31db0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31dc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31dd0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
31de0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
31df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31e00 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
31e10 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
31e20 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
31e30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
31e40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
31e50 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
31e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31e70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
31e80 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
31e90 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
31ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31eb0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
31ec0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31ed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31ee0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
31ef0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
31f00 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
31f10 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
31f20 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
31f30 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
31f40 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
31f50 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
31f60 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
31f70 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
31f80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
31f90 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
31fa0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
31fb0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
31fc0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
31fd0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
31fe0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
31ff0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
32000 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
32010 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
32020 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
32030 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
32040 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
32050 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
32060 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
32070 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
32080 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
32090 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
320a0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
320b0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
320c0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
320d0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
320e0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
320f0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
32100 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
32110 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32120 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
32130 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
32140 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32150 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
32160 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32170 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
32180 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
32190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
321a0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
321b0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
321c0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
321d0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
321e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
321f0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
32200 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32210 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
32220 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
32230 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
32240 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
32250 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
32260 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
32270 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
32280 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
32290 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
322a0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
322b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
322c0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
322d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
322e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
322f0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
32300 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
32310 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
32320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32330 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
32340 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
32350 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
32360 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
32370 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
32380 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
32390 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
323a0 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74  n Cell.  Write t
323b0 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c  he.** local Cell
323c0 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65   size (the numbe
323d0 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68  r of bytes on th
323e0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c  e original page,
323f0 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65   omitting.** ove
32400 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53  rflow) into *pnS
32410 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
32420 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
32430 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
32440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32450 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
32460 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
32470 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32480 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
32490 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
324a0 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e  ell */.  u16 *pn
324b0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
324c0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
324d0 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  ize of the Cell 
324e0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  here */.){.  BtS
324f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
32500 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
32510 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
32520 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
32530 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
32540 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
32550 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
32560 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
32570 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
32580 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
32590 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
325a0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
325b0 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20  o);.  *pnSize = 
325c0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66  info.nSize;.  if
325d0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
325e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
325f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
32600 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
32610 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
32620 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
32630 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
32640 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
32650 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
32660 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
32670 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
32680 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
32690 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
326a0 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
326b0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
326c0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
326d0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
326e0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
326f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
32700 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
32710 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
32720 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
32730 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
32740 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
32750 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
32760 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
32770 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
32780 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
32790 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
327a0 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e  PT_DB && (info.n
327b0 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
327c0 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
327d0 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
327e0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
327f0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
32800 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
32810 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
32820 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
32830 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
32840 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
32850 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
32860 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
32870 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
32880 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
32890 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
328a0 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
328b0 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
328c0 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
328d0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
328e0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
328f0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
32900 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
32910 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
32920 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
32930 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
32940 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
32950 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
32960 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
32970 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
32980 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
32990 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
329a0 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
329b0 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
329c0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
329d0 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
329e0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
329f0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
32a00 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
32a10 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
32a20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
32a30 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
32a40 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
32a50 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
32a60 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
32a70 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
32a80 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
32a90 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
32aa0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
32ab0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
32ac0 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
32ad0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
32ae0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
32af0 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
32b00 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
32b10 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
32b20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
32b30 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
32b40 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
32b50 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
32b60 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
32b70 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
32b80 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
32b90 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
32ba0 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
32bb0 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
32bc0 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
32bd0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
32be0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
32bf0 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
32c00 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
32c10 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
32c20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32c30 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
32c40 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
32c50 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
32c60 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
32c70 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
32c80 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
32c90 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32ca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
32cb0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
32cc0 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
32cd0 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
32ce0 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
32cf0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
32d00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32d10 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
32d20 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
32d30 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
32d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
32d50 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
32d60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
32d70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
32d80 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
32d90 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
32da0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
32db0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
32dc0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
32dd0 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
32de0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
32df0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
32e00 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
32e10 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
32e20 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
32e30 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
32e40 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
32e50 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
32e60 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
32e70 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
32e80 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
32e90 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
32ea0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
32eb0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
32ec0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
32ed0 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
32ee0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
32ef0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
32f00 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
32f10 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
32f20 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
32f30 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
32f40 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
32f50 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
32f60 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
32f70 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
32f80 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
32f90 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
32fa0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
32fb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
32fc0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
32fd0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
32fe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
32ff0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
33000 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
33010 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
33020 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
33030 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
33040 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
33050 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
33060 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
33070 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
33080 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
33090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
330a0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
330b0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
330c0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
330d0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
330e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
330f0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
33100 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
33110 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
33120 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
33130 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
33140 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
33150 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
33160 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
33170 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
33180 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
33190 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
331a0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
331b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
331c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
331d0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
331e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
331f0 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
33200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33210 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33220 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
33230 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
33240 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
33250 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
33260 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
33270 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
33280 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
33290 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
332a0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
332b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
332c0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
332d0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
332e0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
332f0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
33300 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33310 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33320 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33330 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
33340 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
33350 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
33360 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
33370 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
33380 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
33390 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
333a0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
333b0 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
333c0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
333d0 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
333e0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
333f0 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  nData==0 );.    
33400 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30  assert( nZero==0
33410 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   );.  }.  nHeade
33420 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
33430 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33440 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
33450 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
33460 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  he payload size 
33470 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
33480 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
33490 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
334a0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
334b0 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
334c0 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72  else{ .    asser
334d0 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66  t( nKey<=0x7ffff
334e0 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29  fff && pKey!=0 )
334f0 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ;.    nPayload =
33500 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
33510 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
33520 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
33530 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  y;.  }.  if( nPa
33540 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
33550 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20  xLocal ){.    n 
33560 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79  = nHeader + nPay
33570 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61  load;.    testca
33580 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20  se( n==3 );.    
33590 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29  testcase( n==4 )
335a0 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20  ;.    if( n<4 ) 
335b0 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69  n = 4;.    *pnSi
335c0 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  ze = n;.    spac
335d0 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64  eLeft = nPayload
335e0 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
335f0 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cell;.  }else{. 
33600 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67     int mn = pPag
33610 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
33620 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
33630 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
33640 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33650 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
33660 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
33670 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
33680 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
33690 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
336a0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20   );.    if( n > 
336b0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
336c0 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70  ) n = mn;.    sp
336d0 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20  aceLeft = n;.   
336e0 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
336f0 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20  Header + 4;.    
33700 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
33710 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a  nHeader+n];.  }.
33720 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
33730 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20  ell[nHeader];.. 
33740 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
33750 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
33760 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
33770 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
33780 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
33790 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
337a0 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
337b0 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
337c0 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
337d0 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
337e0 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
337f0 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
33800 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
33810 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
33820 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
33830 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
33840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
33850 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
33860 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
33870 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
33880 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
33890 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
338a0 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
338b0 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
338c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
338d0 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
338e0 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
338f0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
33900 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
33910 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
33920 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
33930 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
33940 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
33950 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
33960 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
33970 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
33980 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
33990 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
339a0 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
339b0 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
339c0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
339d0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
339e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
339f0 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  ader=(int)(info.
33a00 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
33a10 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
33a20 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
33a30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33a40 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
33a50 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
33a60 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
33a70 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
33a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
33a90 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e  ior == &pCell[in
33aa0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b  fo.iOverflow] );
33ab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
33ac0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
33ad0 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
33ae0 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
33af0 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
33b00 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
33b10 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
33b20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
33b30 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
33b40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33b50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
33b60 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
33b70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
33b80 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
33b90 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
33ba0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
33bb0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33bc0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
33bd0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
33be0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
33bf0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
33c00 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
33c10 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
33c20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
33c30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33c40 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
33c50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33c60 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
33c70 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
33c80 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
33c90 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
33ca0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33cb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33cc0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
33cd0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
33ce0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
33cf0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
33d00 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
33d10 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
33d20 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
33d30 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
33d40 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
33d50 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
33d60 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
33d70 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
33d80 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
33d90 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
33da0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
33db0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
33dc0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
33dd0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
33de0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
33df0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
33e00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
33e10 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
33e20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
33e30 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
33e40 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
33e50 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
33e60 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
33e70 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
33e80 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
33e90 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
33ea0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
33eb0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33ec0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33ed0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33ee0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
33ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33f00 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
33f10 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
33f20 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
33f30 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
33f40 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
33f50 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
33f60 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
33f70 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
33f80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
33f90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
33fa0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
33fb0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33fc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33fd0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33fe0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
33ff0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34000 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
34010 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
34020 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
34030 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
34040 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
34050 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
34060 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
34070 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
34080 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
34090 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
340a0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
340b0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
340c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
340d0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
340e0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
340f0 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
34100 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
34110 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
34120 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
34130 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
34140 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34150 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
34160 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
34170 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
34180 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
34190 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
341a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
341b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
341c0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
341d0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
341e0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
341f0 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
34200 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
34210 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
34220 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
34230 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
34240 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
34250 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34260 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
34270 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
34280 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
34290 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
342a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
342b0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
342c0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
342d0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
342e0 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
342f0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
34300 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
34310 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
34320 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
34330 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
34340 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
34350 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
34360 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
34370 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
34380 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
34390 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
343a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
343b0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
343c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
343d0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
343e0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
343f0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
34400 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
34410 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
34420 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
34430 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
34440 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
34450 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
34460 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
34470 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
34480 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34490 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
344a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
344b0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
344c0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
344d0 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
344e0 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
344f0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
34500 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
34510 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
34520 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34530 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
34540 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
34550 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
34560 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
34570 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
34580 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
34590 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
345a0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
345b0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
345c0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
345d0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
345e0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
345f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
34600 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
34610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34620 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
34630 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
34640 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
34650 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
34660 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
34670 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
34680 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
34690 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
346a0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
346b0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
346c0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
346d0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
346e0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
346f0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
34700 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
34710 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
34720 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
34730 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
34740 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
34750 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
34760 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
34770 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
34780 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
34790 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
347a0 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
347b0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
347c0 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
347d0 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
347e0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
347f0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
34800 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
34810 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
34820 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
34830 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
34840 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
34850 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
34860 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
34870 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
34880 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
34890 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
348a0 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
348b0 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
348c0 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
348d0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
348e0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
348f0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
34900 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
34910 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
34920 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
34930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34940 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34950 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34960 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
34970 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34980 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
34990 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
349a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
349b0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
349c0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
349d0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
349e0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
349f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
34a00 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
34a10 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
34a20 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
34a30 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
34a40 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
34a50 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
34a60 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
34a70 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
34a80 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
34a90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34aa0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
34ab0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34ac0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
34ad0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
34ae0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
34af0 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
34b00 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
34b10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
34b20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
34b30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
34b40 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
34b50 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
34b60 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
34b70 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
34b80 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
34b90 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
34ba0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
34bb0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
34bc0 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
34bd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
34be0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
34bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c00 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
34c10 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
34c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
34c30 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
34c40 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
34c50 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
34c60 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
34c70 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
34c80 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
34c90 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
34ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
34cb0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
34cc0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
34cd0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
34ce0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
34cf0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
34d00 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
34d10 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
34d20 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
34d30 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
34d40 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
34d50 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
34d60 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
34d70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
34d80 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
34d90 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
34da0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
34db0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
34dc0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
34dd0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
34de0 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
34df0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
34e00 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
34e10 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
34e20 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
34e30 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
34e40 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
34e50 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
34e60 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
34e70 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
34e80 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
34e90 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
34ea0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
34eb0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
34ec0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
34ed0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34ee0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
34ef0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
34f00 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
34f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
34f20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
34f30 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
34f40 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
34f50 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
34f60 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
34f70 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
34f80 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
34f90 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
34fa0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
34fb0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
34fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
34fd0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
34fe0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
34ff0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
35000 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
35010 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
35020 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
35030 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
35040 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
35050 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
35060 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
35070 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
35080 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
35090 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
350a0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
350b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
350c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
350d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
350e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
350f0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
35100 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
35110 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
35120 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49  page */.  u8 *pI
35130 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ns;         /* T
35140 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67  he point in pPag
35150 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68  e->aCellIdx[] wh
35160 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65  ere no cell inse
35170 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  rted */..  if( *
35180 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
35190 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
351a0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
351b0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
351c0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
351d0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
351e0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
351f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
35200 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
35210 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
35220 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
35230 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
35240 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
35250 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
35260 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
35270 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
35280 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
35290 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
352a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
352b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
352c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
352d0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
352e0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
352f0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
35300 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
35310 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
35320 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
35330 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
35340 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
35350 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
35360 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
35370 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
35380 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
35390 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
353a0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
353b0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
353c0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
353d0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
353e0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
353f0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
35400 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
35410 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
35420 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
35430 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
35440 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
35450 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
35460 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
35470 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
35480 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
35490 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
354a0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
354b0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
354c0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
354d0 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
354e0 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
354f0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
35500 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
35510 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
35520 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
35530 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
35540 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
35550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
35560 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
35570 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
35580 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
35590 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
355a0 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
355b0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
355c0 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
355d0 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
355e0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
355f0 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
35600 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
35610 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
35620 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
35630 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
35640 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
35650 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
35660 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
35670 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
35680 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
35690 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
356a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
356b0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
356c0 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
356d0 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
356e0 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
356f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
35700 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
35710 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
35720 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
35730 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
35740 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
35750 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
35760 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
35770 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
35780 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
35790 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
357a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
357b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
357c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
357d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
357e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
357f0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
35800 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
35810 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35820 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35830 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35840 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
35850 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35860 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
35870 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
35880 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
35890 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
358a0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
358b0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
358c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
358d0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
358e0 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
358f0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
35900 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
35910 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
35920 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
35930 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
35940 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
35950 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35960 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
35970 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
35980 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
35990 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
359a0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
359b0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
359c0 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
359d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
359e0 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
359f0 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
35a00 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
35a10 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
35a20 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
35a30 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
35a40 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
35a50 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
35a60 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
35a70 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
35a80 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
35a90 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
35aa0 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
35ab0 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
35ac0 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
35ad0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
35ae0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
35af0 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
35b00 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
35b10 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
35b20 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
35b30 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
35b40 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
35b50 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
35b60 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
35b70 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
35b80 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
35b90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35ba0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
35bb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
35bc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
35bd0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
35be0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
35bf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
35c00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
35c10 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
35c20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
35c30 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
35c40 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
35c50 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
35c60 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
35c70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
35c80 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
35c90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
35ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
35cb0 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
35cc0 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
35cd0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
35ce0 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
35cf0 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
35d00 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
35d10 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c  ight be held mul
35d20 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  tiple pages..*/.
35d30 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
35d40 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72  ellArray CellArr
35d50 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41  ay;.struct CellA
35d60 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65  rray {.  int nCe
35d70 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
35d80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
35d90 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
35da0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  */.  MemPage *pR
35db0 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
35dc0 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a  Reference page *
35dd0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
35de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35df0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
35e00 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
35e10 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
35e20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
35e30 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
35e40 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d  in apCell[] */.}
35e50 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
35e60 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  re the cell size
35e70 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c  s at idx, idx+1,
35e80 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61   ..., idx+N-1 ha
35e90 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  ve been.** compu
35ea0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
35eb0 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c  oid populateCell
35ec0 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20  Cache(CellArray 
35ed0 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
35ee0 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   N){.  assert( i
35ef0 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d  dx>=0 && idx+N<=
35f00 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68  p->nCell );.  wh
35f10 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20  ile( N>0 ){.    
35f20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c  assert( p->apCel
35f30 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20  l[idx]!=0 );.   
35f40 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69   if( p->szCell[i
35f50 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx]==0 ){.      
35f60 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d  p->szCell[idx] =
35f70 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
35f80 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
35f90 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20  apCell[idx]);.  
35fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
35fb0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
35fc0 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  B ||.           
35fd0 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
35fe0 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  ]==p->pRef->xCel
35ff0 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36000 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29  ->apCell[idx]) )
36010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b  ;.    }.    idx+
36020 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  +;.    N--;.  }.
36030 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
36040 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
36050 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  Nth element of t
36060 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f  he cell array.*/
36070 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
36080 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70  OINLINE u16 comp
36090 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  uteCellSize(Cell
360a0 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
360b0 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
360c0 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
360d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
360e0 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20  zCell[N]==0 );. 
360f0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20   p->szCell[N] = 
36100 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
36110 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
36120 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74  pCell[N]);.  ret
36130 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36140 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
36150 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65  achedCellSize(Ce
36160 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36170 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
36180 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
36190 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43   );.  if( p->szC
361a0 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20  ell[N] ) return 
361b0 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20  p->szCell[N];.  
361c0 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65  return computeCe
361d0 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a  llSize(p, N);.}.
361e0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
361f0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70  ell[] contains p
36200 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c  ointers to nCell
36210 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c   b-tree page cel
36220 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65  ls. The .** szCe
36230 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ll[] array conta
36240 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
36250 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65  bytes of each ce
36260 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36270 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68  n.** replaces th
36280 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
36290 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77  ts of page pPg w
362a0 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
362b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   of the cell.** 
362c0 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  array..**.** Som
362d0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69  e of the cells i
362e0 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63  n apCell[] may c
362f0 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
36300 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a  ed in pPg. This.
36310 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  ** function work
36320 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  s around problem
36330 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73  s caused by this
36340 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70   by making a cop
36350 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63  y of any .** suc
36360 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f  h cells before o
36370 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70  verwriting the p
36380 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  age data..**.** 
36390 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65  The MemPage.nFre
363a0 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
363b0 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66  idated by this f
363c0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
363d0 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
363e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
363f0 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
36400 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
36410 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61  ic int rebuildPa
36420 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
36430 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
36440 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
36450 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
36460 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
36470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36480 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
36490 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
364a0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
364b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364c0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
364d0 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
364e0 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
364f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
36500 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
36510 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
36520 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
36530 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
36540 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
36550 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
36560 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
36570 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
36580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
36590 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
365a0 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
365b0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
365c0 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
365d0 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
365e0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
365f0 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
36600 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
36610 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
36620 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
36630 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
36640 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
36650 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
36660 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
36670 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
36680 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
36690 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
366a0 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
366b0 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
366c0 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
366d0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
366e0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
366f0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
36700 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61  .    if( pCell>a
36710 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45  Data && pCell<pE
36720 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c  nd ){.      pCel
36730 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20  l = &pTmp[pCell 
36740 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a  - aData];.    }.
36750 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43      pData -= szC
36760 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ell[i];.    put2
36770 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28  byte(pCellptr, (
36780 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b  pData - aData));
36790 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d  .    pCellptr +=
367a0 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74   2;.    if( pDat
367b0 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72  a < pCellptr ) r
367c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
367d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d  RUPT_BKPT;.    m
367e0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65  emcpy(pData, pCe
367f0 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a  ll, szCell[i]);.
36800 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65      assert( szCe
36810 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c  ll[i]==pPg->xCel
36820 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c  lSize(pPg, pCell
36830 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
36840 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
36850 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d   szCell[i]!=pPg-
36860 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70  >xCellSize(pPg,p
36870 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  Cell) );.  }..  
36880 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  /* The pPg->nFre
36890 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73  e field is now s
368a0 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
368b0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
368c0 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67  fix it. */.  pPg
368d0 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
368e0 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f  .  pPg->nOverflo
368f0 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79  w = 0;..  put2by
36900 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d  te(&aData[hdr+1]
36910 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65  , 0);.  put2byte
36920 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20  (&aData[hdr+3], 
36930 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  pPg->nCell);.  p
36940 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
36950 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61  dr+5], pData - a
36960 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68  Data);.  aData[h
36970 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20  dr+7] = 0x00;.  
36980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
369a0 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
369b0 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72  ns nCell pointer
369c0 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c  s to b-tree cell
369d0 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a  s. Array szCell.
369e0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
369f0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
36a00 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e   each such cell.
36a10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
36a20 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61  ttempts to .** a
36a30 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f  dd the cells sto
36a40 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61 79  red in the array
36a50 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66   to page pPg. If
36a60 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61   it cannot (beca
36a70 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
36a80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65 66   needs to be def
36a90 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  ragmented before
36aa0 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20   the cells will 
36ab0 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  fit), non-zero.*
36ac0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  * is returned. O
36ad0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
36ae0 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64   cells are added
36af0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a   successfully, z
36b00 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ero is.** return
36b10 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  ed..**.** Argume
36b20 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e  nt pCellptr poin
36b30 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
36b40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c  entry in the cel
36b50 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l-pointer array.
36b60 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67 65  ** (part of page
36b70 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74   pPg) to populat
36b80 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70  e. After cell ap
36b90 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74  Cell[0] is writt
36ba0 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67  en to the.** pag
36bb0 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74  e body, a 16-bit
36bc0 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74 74   offset is writt
36bd0 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20  en to pCellptr. 
36be0 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65  And so on, for e
36bf0 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74  ach.** cell in t
36c00 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73 20  he array. It is 
36c10 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
36c20 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
36c30 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68   to ensure.** th
36c40 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  at it is safe to
36c50 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20   overwrite this 
36c60 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  part of the cell
36c70 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a  -pointer array..
36c80 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
36c90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36ca0 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e  ed, *ppData poin
36cb0 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ts to the start 
36cc0 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  of the .** conte
36cd0 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20  nt area on page 
36ce0 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65  pPg. If the size
36cf0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
36d00 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65 64  area is extended
36d10 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20  ,.** *ppData is 
36d20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74  updated to point
36d30 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72   to the new star
36d40 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  t of the content
36d50 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20   area.** before 
36d60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
36d70 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65   Finally, argume
36d80 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73  nt pBegin points
36d90 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d   to the byte imm
36da0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
36db0 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  ng the.** end of
36dc0 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
36dd0 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65  red by this page
36de0 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f   for the cell-po
36df0 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a  inter area (for.
36e00 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e  ** all cells - n
36e10 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e  ot just those in
36e20 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63 75  serted by the cu
36e30 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20  rrent call). If 
36e40 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61  the content.** a
36e50 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74 65  rea must be exte
36e60 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74  nded to before t
36e70 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
36e80 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  er to accomodate
36e90 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e   all.** cells in
36ea0 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20   apCell[], then 
36eb0 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74  the cells do not
36ec0 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72   fit and non-zer
36ed0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
36ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
36ef0 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
36f00 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20 63  /* Page to add c
36f30 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20  ells to */.  u8 
36f40 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20  *pBegin,        
36f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36f60 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e  End of cell-poin
36f70 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75  ter array */.  u
36f80 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20  8 **ppData,     
36f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36fa0 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63  * IN/OUT: Page c
36fb0 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69  ontent -area poi
36fc0 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
36fd0 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20  ellptr,         
36fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
36ff0 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69  nter to cell-poi
37000 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69  nter area */.  i
37010 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  nt iFirst,      
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37030 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
37040 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a   cell to add */.
37050 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
37060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37070 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
37080 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70  ells to add to p
37090 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61  Pg */.  CellArra
370a0 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20  y *pCArray      
370b0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
370c0 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a   of cells */.){.
370d0 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61    int i;.  u8 *a
370e0 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
370f0 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d  a;.  u8 *pData =
37100 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20   *ppData;.  int 
37110 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20  iEnd = iFirst + 
37120 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
37130 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70   CORRUPT_DB || p
37140 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  Pg->hdrOffset==0
37150 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20   );    /* Never 
37160 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
37170 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72   */.  for(i=iFir
37180 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
37190 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72 63  {.    int sz, rc
371a0 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b  ;.    u8 *pSlot;
371b0 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65 64  .    sz = cached
371c0 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79  CellSize(pCArray
371d0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28 61  , i);.    if( (a
371e0 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44  Data[1]==0 && aD
371f0 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70  ata[2]==0) || (p
37200 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53  Slot = pageFindS
37210 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29 29  lot(pPg,sz,&rc))
37220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ==0 ){.      pDa
37230 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ta -= sz;.      
37240 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e  if( pData<pBegin
37250 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
37260 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61     pSlot = pData
37270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 70  ;.    }.    /* p
37280 53 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61 79  Slot and pCArray
37290 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c  ->apCell[i] will
372a0 20 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20 6f   never overlap o
372b0 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  n a well-formed.
372c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
372d0 20 20 42 75 74 20 74 68 65 79 20 6d 69 67 68 74    But they might
372e0 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20 64   for a corrupt d
372f0 61 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65 20  atabase.  Hence 
37300 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20 20  use memmove().  
37310 20 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63 70    ** since memcp
37320 79 28 29 20 73 65 6e 64 73 20 53 49 47 41 42 4f  y() sends SIGABO
37330 52 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70 70  RT with overlapp
37340 69 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20 4f  ing buffers on O
37350 70 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61 73  penBSD */.    as
37360 73 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a 29  sert( (pSlot+sz)
37370 3c 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  <=pCArray->apCel
37380 6c 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c  l[i].         ||
37390 20 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61 79   pSlot>=(pCArray
373a0 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a  ->apCell[i]+sz).
373b0 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
373c0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d 65  UPT_DB );.    me
373d0 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43 41  mmove(pSlot, pCA
373e0 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c  rray->apCell[i],
373f0 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79   sz);.    put2by
37400 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53  te(pCellptr, (pS
37410 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  lot - aData));. 
37420 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
37430 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20  ;.  }.  *ppData 
37440 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72  = pData;.  retur
37450 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  n 0;.}../*.** Ar
37460 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
37470 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e  tains nCell poin
37480 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63  ters to b-tree c
37490 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65  ells. Array szCe
374a0 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ll .** contains 
374b0 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
374c0 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
374d0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
374e0 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73  on adds the.** s
374f0 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  pace associated 
37500 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69  with each cell i
37510 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74  n the array that
37520 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74   is currently st
37530 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20  ored .** within 
37540 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20  the body of pPg 
37550 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d  to the pPg free-
37560 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70  list. The cell-p
37570 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65  ointers and othe
37580 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74  r.** fields of t
37590 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20  he page are not 
375a0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  updated..**.** T
375b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
375c0 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
375d0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61  umber of cells a
375e0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
375f0 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  -list..*/.static
37600 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72   int pageFreeArr
37610 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
37620 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
37630 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37640 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69   edit */.  int i
37650 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
37660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37670 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65  rst cell to dele
37680 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  te */.  int nCel
37690 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
376a0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73          /* Cells
376b0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
376c0 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72  CellArray *pCArr
376d0 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
376e0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
376f0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
37700 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
37710 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
37720 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
37730 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ata[pPg->pBt->us
37740 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20  ableSize];.  u8 
37750 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d  * const pStart =
37760 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72   &aData[pPg->hdr
37770 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67  Offset + 8 + pPg
37780 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
37790 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b  .  int nRet = 0;
377a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
377b0 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20  iEnd = iFirst + 
377c0 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72  nCell;.  u8 *pFr
377d0 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a  ee = 0;.  int sz
377e0 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Free = 0;..  for
377f0 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e  (i=iFirst; i<iEn
37800 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  d; i++){.    u8 
37810 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79  *pCell = pCArray
37820 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  ->apCell[i];.   
37830 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61   if( pCell>=pSta
37840 72 74 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64  rt && pCell<pEnd
37850 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
37860 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ;.      /* No ne
37870 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64  ed to use cached
37880 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e  CellSize() here.
37890 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61    The sizes of a
378a0 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20  ll cells that.  
378b0 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65      ** are to be
378c0 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65   freed have alre
378d0 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69  ady been computi
378e0 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e  ng while decidin
378f0 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  g which.      **
37900 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65   cells need free
37910 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20  ing */.      sz 
37920 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c  = pCArray->szCel
37930 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73  l[i];  assert( s
37940 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  z>0 );.      if(
37950 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
37960 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
37970 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
37980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37990 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
379a0 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
379b0 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20  536 );.         
379c0 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
379d0 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
379e0 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
379f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37a00 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
37a10 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
37a20 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
37a30 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
37a40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
37a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37a60 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
37a70 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
37a80 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
37a90 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
37aa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
37ab0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37ac0 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
37ad0 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
37ae0 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65  5536 );.    free
37af0 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
37b00 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
37b10 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   szFree);.  }.  
37b20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
37b30 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61  /*.** apCell[] a
37b40 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74  nd szCell[] cont
37b50 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
37b60 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c   and sizes of al
37b70 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a  l cells in the.*
37b80 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  * pages being ba
37b90 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72  lanced.  The cur
37ba0 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20  rent page, pPg, 
37bb0 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63  has pPg->nCell c
37bc0 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ells starting.**
37bd0 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c   with apCell[iOl
37be0 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e  d].  After balan
37bf0 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20  cing, this page 
37c00 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77  should hold nNew
37c10 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69   cells.** starti
37c20 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65  ng at apCell[iNe
37c30 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  w]..**.** This r
37c40 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
37c50 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
37c60 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f  tments to pPg so
37c70 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
37c80 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
37c90 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69   cells after bei
37ca0 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a  ng balanced..**.
37cb0 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  ** The pPg->nFre
37cc0 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
37cd0 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  id when this fun
37ce0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
37cf0 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70  t is the.** resp
37d00 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
37d10 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
37d20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
37d30 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74  .static int edit
37d40 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
37d50 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
37d60 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
37d70 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
37d80 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20  nt iOld,        
37d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37da0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
37db0 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20   cell currently 
37dc0 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
37dd0 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   iNew,          
37de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37df0 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72  Index of new fir
37e00 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20  st cell on page 
37e10 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20  */.  int nNew,  
37e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e30 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
37e40 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
37e50 20 70 61 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41   page */.  CellA
37e60 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20  rray *pCArray   
37e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
37e80 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64  ray of cells and
37e90 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   sizes */.){.  u
37ea0 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
37eb0 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
37ec0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
37ed0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
37ee0 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26    u8 *pBegin = &
37ef0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e  pPg->aCellIdx[nN
37f00 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e  ew * 2];.  int n
37f10 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c  Cell = pPg->nCel
37f20 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  l;       /* Cell
37f30 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20  s stored on pPg 
37f40 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  */.  u8 *pData;.
37f50 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a    u8 *pCellptr;.
37f60 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
37f70 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20  OldEnd = iOld + 
37f80 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67  pPg->nCell + pPg
37f90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69  ->nOverflow;.  i
37fa0 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65  nt iNewEnd = iNe
37fb0 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  w + nNew;..#ifde
37fc0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
37fd0 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
37fe0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
37ff0 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
38000 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  er);.  memcpy(pT
38010 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e  mp, aData, pPg->
38020 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
38030 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
38040 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d  emove cells from
38050 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
38060 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
38070 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65  /.  if( iOld<iNe
38080 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68  w ){.    int nSh
38090 69 66 74 20 3d 20 70 61 67 65 46 72 65 65 41 72  ift = pageFreeAr
380a0 72 61 79 28 70 50 67 2c 20 69 4f 6c 64 2c 20 69  ray(pPg, iOld, i
380b0 4e 65 77 2d 69 4f 6c 64 2c 20 70 43 41 72 72 61  New-iOld, pCArra
380c0 79 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  y);.    memmove(
380d0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26  pPg->aCellIdx, &
380e0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53  pPg->aCellIdx[nS
380f0 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32  hift*2], nCell*2
38100 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20  );.    nCell -= 
38110 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66  nShift;.  }.  if
38120 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64  ( iNewEnd < iOld
38130 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c  End ){.    nCell
38140 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61   -= pageFreeArra
38150 79 28 70 50 67 2c 20 69 4e 65 77 45 6e 64 2c 20  y(pPg, iNewEnd, 
38160 69 4f 6c 64 45 6e 64 20 2d 20 69 4e 65 77 45 6e  iOldEnd - iNewEn
38170 64 2c 20 70 43 41 72 72 61 79 29 3b 0a 20 20 7d  d, pCArray);.  }
38180 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44 61  ..  pData = &aDa
38190 74 61 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ta[get2byteNotZe
381a0 72 6f 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  ro(&aData[hdr+5]
381b0 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c  )];.  if( pData<
381c0 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64  pBegin ) goto ed
381d0 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20  itpage_fail;..  
381e0 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20  /* Add cells to 
381f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
38200 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69   page */.  if( i
38210 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20  New<iOld ){.    
38220 69 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e  int nAdd = MIN(n
38230 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a  New,iOld-iNew);.
38240 20 20 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c      assert( (iOl
38250 64 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20  d-iNew)<nNew || 
38260 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52  nCell==0 || CORR
38270 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43  UPT_DB );.    pC
38280 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
38290 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d  ellIdx;.    memm
382a0 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41  ove(&pCellptr[nA
382b0 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c  dd*2], pCellptr,
382c0 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69   nCell*2);.    i
382d0 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
382e0 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ay(.          pP
382f0 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
38300 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
38310 20 20 20 20 20 20 20 69 4e 65 77 2c 20 6e 41 64         iNew, nAd
38320 64 2c 20 70 43 41 72 72 61 79 0a 20 20 20 20 29  d, pCArray.    )
38330 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
38340 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c  _fail;.    nCell
38350 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20   += nAdd;.  }.. 
38360 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72   /* Add any over
38370 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  flow cells */.  
38380 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e  for(i=0; i<pPg->
38390 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b  nOverflow; i++){
383a0 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d  .    int iCell =
383b0 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69   (iOld + pPg->ai
383c0 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b  Ovfl[i]) - iNew;
383d0 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d  .    if( iCell>=
383e0 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20  0 && iCell<nNew 
383f0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74  ){.      pCellpt
38400 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
38410 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20  dx[iCell * 2];. 
38420 20 20 20 20 20 6d 65 6d 6d