/ Hex Artifact Content
Login

Artifact 134f1b049d65b6598542bc2a2c209c6d38b5f239:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
3120: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
3130: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
3140: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
3150: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
3160: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
3170: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
3180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
3190: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
31a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
31b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
31c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
31d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
31e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
31f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
3200: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
3210: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
3220: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
3230: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
3240: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
3250: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
3260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
3270: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
3280: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
3290: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
32a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
32b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
32c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
32e0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
32f0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
3300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
3320: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
3330: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
3340: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
3350: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
3360: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
3380: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
3390: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
33a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33b0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
33c0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
33d0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
33e0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
33f0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
3400: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3410: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a  TS_PENDING flag.
3420: 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72  ** may be incorr
3430: 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a  ectly cleared..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
3450: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
3460: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3470: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3490: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
34a0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
34b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
34d0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
34e0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
34f0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
3500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
3510: 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68  Trans>0 );..  wh
3520: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
3530: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3540: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
3550: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
3560: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
3570: 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70  CLUSIVE)==0 || p
3580: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
3590: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
35a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
35b0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
35c0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
35d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
35e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
35f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
3600: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3620: 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c  >iTable!=1 || pL
3630: 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b  ock==&p->lock );
3640: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
3650: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20  ->iTable!=1 ){. 
3660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3670: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
3680: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3690: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
36a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
36b0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
36c0: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
36d0: 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d   & BTS_PENDING)=
36e0: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
36f0: 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  er );.  if( pBt-
3700: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3710: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3720: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3730: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3740: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3750: 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20  NDING);.  }else 
3760: 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  if( pBt->nTransa
3770: 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  ction==2 ){.    
3780: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
37a0: 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c  Btree p is concl
37b0: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
37c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37d0: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
37e0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
37f0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
3800: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
3810: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
3820: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
3830: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
3840: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
3850: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
3860: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
3870: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
3880: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
3890: 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e   set the BTS_PEN
38a0: 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a  DING flag to 0..
38b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
38c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
38d0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
38e0: 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49  , then BTS_PENDI
38f0: 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  NG must.    ** b
3900: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
3910: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
3920: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
3930: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
3940: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  */.    pBt->btsF
3950: 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e  lags &= ~BTS_PEN
3960: 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DING;.  }.}../*.
3970: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3980: 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69   changes all wri
3990: 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te-locks held by
39a0: 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65   Btree p into re
39b0: 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  ad-locks..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61  tic void downgra
39d0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
39e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
39f0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3a00: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3a10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3a20: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c  er==p ){.    BtL
3a30: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20  ock *pLock;.    
3a40: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3a50: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ;.    pBt->btsFl
3a60: 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43  ags &= ~(BTS_EXC
3a70: 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49  LUSIVE|BTS_PENDI
3a80: 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  NG);.    for(pLo
3a90: 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  ck=pBt->pLock; p
3aa0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63  Lock; pLock=pLoc
3ab0: 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  k->pNext){.     
3ac0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3ad0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
3ae0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65   || pLock->pBtre
3af0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c  e==p );.      pL
3b00: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41  ock->eLock = REA
3b10: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
3b20: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
3b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3b40: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
3b50: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
3b60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
3b70: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
3b80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
3b90: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
3ba0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3bb0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
3bc0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
3bd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
3be0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
3bf0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
3c00: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
3c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c20: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
3c30: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
3c40: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
3c50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3c60: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
3c70: 78 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  x);.}.static int
3c80: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
3c90: 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29  red(BtCursor *p)
3ca0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
3cb0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  orHoldsMutex(p) 
3cc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
3cd0: 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70  pBtree->db==p->p
3ce0: 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69  Bt->db);.}.#endi
3cf0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  f../*.** Invalid
3d00: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
3d10: 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
3d20: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
3d30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3d40: 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  t..** on the sha
3d50: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3d60: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66  ure pBt..*/.#def
3d70: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
3d80: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
3d90: 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ) (pCur->curFlag
3da0: 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
3db0: 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  Ovfl)../*.** Inv
3dc0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
3dd0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
3de0: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
3df0: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
3e00: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3e10: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e30: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
3e40: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
3e50: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
3e60: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
3e70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3e80: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3e90: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
3ea0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
3eb0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ed0: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
3ee0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3ef0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3f00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3f10: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
3f20: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
3f30: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3f40: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e  a table.** to in
3f50: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
3f60: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68  rblob cursors th
3f70: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  at are open on t
3f80: 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65  he.** row or one
3f90: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69   of the rows bei
3fa0: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
3fb0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
3fc0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
3fd0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
3fe0: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
3ff0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
4000: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
4010: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
4020: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
4030: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
4040: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
4050: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
4060: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
4070: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
4080: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
4090: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
40a0: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
40b0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
40c0: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
40d0: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
40e0: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
40f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
4100: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
4110: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
4120: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
4130: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72   that specific r
4140: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
4150: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
4160: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
4170: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
4180: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
4190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
41a0: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69  check */.  i64 i
41b0: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
41c0: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
41d0: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
41e0: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
41f0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
4200: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
4210: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
4220: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
4230: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
4240: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4250: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4260: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4270: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4280: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4290: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
42a0: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
42b0: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
42c0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
42d0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
42e0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
42f0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
4300: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
4310: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
4320: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
4330: 20 20 20 20 20 69 66 28 20 69 73 43 6c 65 61 72       if( isClear
4340: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
4350: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20  .nKey==iRow ){. 
4360: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
4370: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
4380: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
4390: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
43a0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
43b0: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
43c0: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
43d0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
43e0: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
43f0: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
4400: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4410: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4420: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4430: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4440: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4450: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
4460: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
4470: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
4480: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
4490: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
44a0: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
44b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
44c0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
44d0: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
44e0: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
44f0: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4500: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4510: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4520: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4530: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
4540: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
4550: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
4560: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
4570: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
4580: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
4590: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
45a0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
45b0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
45c0: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
45d0: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
45e0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
45f0: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4600: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4610: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4620: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4630: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
4640: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
4650: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
4660: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
4670: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4680: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4690: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
46a0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
46b0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
46c0: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
46d0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
46e0: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
46f0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4700: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4720: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4730: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
4740: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
4750: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
4760: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
4770: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4780: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4790: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
47a0: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
47b0: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
47c0: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
47d0: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
47e0: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
47f0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4800: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4810: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4820: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4830: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
4840: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
4850: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
4860: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
4870: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4880: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4890: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
48a0: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
48b0: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
48c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
48d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
48e0: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
48f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4900: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4910: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4920: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4930: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
4940: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
4950: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
4960: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
4970: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4980: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4990: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
49a0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
49b0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
49c0: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
49d0: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
49e0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
49f0: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4a00: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4a10: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4a20: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4a30: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
4a40: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
4a50: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
4a60: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
4a70: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4a80: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4a90: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4aa0: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4ab0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4ac0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4ad0: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4ae0: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4af0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4b00: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4b10: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4b20: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4b30: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4b40: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
4b50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4b60: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4b70: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4b80: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4b90: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4ba0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4bb0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4bc0: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4bd0: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4be0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4bf0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4c00: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
4c10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
4c20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e  SQLITE_OK && pgn
4c30: 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  o<=sqlite3Bitvec
4c40: 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f  Size(pBt->pHasCo
4c50: 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63  ntent) ){.    rc
4c60: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4c70: 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  Set(pBt->pHasCon
4c80: 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  tent, pgno);.  }
4c90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4ca0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65  ./*.** Query the
4cb0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4cc0: 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a  ntent vector..**
4cd0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4ce0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
4cf0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4d00: 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65  f page is remove
4d10: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72  d from the.** fr
4d20: 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73  ee-list for reus
4d30: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61  e. It returns fa
4d40: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66  lse if it is saf
4d50: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  e to retrieve th
4d60: 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74  e.** page from t
4d70: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  he pager layer w
4d80: 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
4d90: 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
4da0: 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  rue otherwise..*
4db0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4dc0: 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
4dd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4de0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74  gno pgno){.  Bit
4df0: 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48  vec *p = pBt->pH
4e00: 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74  asContent;.  ret
4e10: 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e  urn (p && (pgno>
4e20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4e30: 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42  e(p) || sqlite3B
4e40: 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e  itvecTest(p, pgn
4e50: 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  o)));.}../*.** C
4e60: 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74  lear (destroy) t
4e70: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4e80: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4e90: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a  This should be.*
4ea0: 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  * invoked at the
4eb0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65   conclusion of e
4ec0: 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ach write-transa
4ed0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4ee0: 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72   void btreeClear
4ef0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4f00: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
4f10: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
4f20: 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  y(pBt->pHasConte
4f30: 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73  nt);.  pBt->pHas
4f40: 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  Content = 0;.}..
4f50: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
4f60: 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b  l of the apPage[
4f70: 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75  ] pages for a cu
4f80: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
4f90: 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73  void btreeReleas
4fa0: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
4fb0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
4fc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4fd0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4fe0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  age; i++){.    r
4ff0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
5000: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
5010: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
5020: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72   = 0;.  }.  pCur
5030: 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a  ->iPage = -1;.}.
5040: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
5050: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
5060: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75  only argument mu
5070: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  st point to a va
5080: 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65  lid entry.** whe
5090: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
50a0: 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20  is called (i.e. 
50b0: 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52  have eState==CUR
50c0: 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73  SOR_VALID). This
50d0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76  .** function sav
50e0: 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
50f0: 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72  ursor key in var
5100: 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65  iables pCur->nKe
5110: 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70  y and.** pCur->p
5120: 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  Key. SQLITE_OK i
5130: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
5140: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53  ccessful or an S
5150: 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20  QLite error .** 
5160: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
5170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
5180: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5190: 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n intkey table, 
51a0: 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72  then the integer
51b0: 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77   key.** (the row
51c0: 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e  id) is stored in
51d0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20   pCur->nKey and 
51e0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65  pCur->pKey is le
51f0: 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c  ft set to.** NUL
5200: 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  L. If the cursor
5210: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f   is open on a no
5220: 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n-intkey table, 
5230: 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20  then pCur->pKey 
5240: 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f  is .** set to po
5250: 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65  int to a malloce
5260: 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e  d buffer pCur->n
5270: 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  Key bytes in siz
5280: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  e containing .**
5290: 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61   the key..*/.sta
52a0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
52b0: 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  orKey(BtCursor *
52c0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
52d0: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
52e0: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
52f0: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
5300: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
5310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
5320: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5330: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
5340: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
5350: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
5360: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
5370: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5380: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
5390: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
53a0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
53b0: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
53c0: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
53d0: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
53e0: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
53f0: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
5400: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
5410: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
5420: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
5430: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
5440: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
5450: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
5460: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
5470: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
5480: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5490: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
54a0: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
54b0: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
54c0: 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 69  ** data.  */.  i
54d0: 66 28 20 30 3d 3d 70 43 75 72 2d 3e 63 75 72 49  f( 0==pCur->curI
54e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69  ntKey ){.    voi
54f0: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
5500: 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e  3Malloc( pCur->n
5510: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5520: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
5530: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
5540: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
5550: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
5560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5580: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5590: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
55a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
55b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
55c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
55d0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
55e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
55f0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  T;.    }.  }.  a
5600: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75  ssert( !pCur->cu
5610: 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  rIntKey || !pCur
5620: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75  ->pKey );.  retu
5630: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5640: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
5650: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
5660: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
5670: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
5680: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
5690: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
56a0: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
56b0: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
56c0: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
56d0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
56e0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
56f0: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
5700: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
5710: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
5720: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
5730: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
5740: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
5750: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
5760: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5770: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
5780: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5790: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c  ==pCur->eState |
57a0: 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  | CURSOR_SKIPNEX
57b0: 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  T==pCur->eState 
57c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
57d0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
57e0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
57f0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5800: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
5810: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
5820: 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43  IPNEXT ){.    pC
5830: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5840: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
5850: 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b  se{.    pCur->sk
5860: 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ipNext = 0;.  }.
5870: 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  .  rc = saveCurs
5880: 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69  orKey(pCur);.  i
5890: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
58a0: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
58b0: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
58c0: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
58d0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
58e0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
58f0: 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75  .  }..  pCur->cu
5900: 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
5910: 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
5920: 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41  ValidOvfl|BTCF_A
5930: 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  tLast);.  return
5940: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
5950: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5960: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
5970: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
5980: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43  ursorsOnList(BtC
5990: 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75  ursor*,Pgno,BtCu
59a0: 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  rsor*);../*.** S
59b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
59c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
59d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
59e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
59f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5a00: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
5a10: 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74  Root.  "Saving t
5a20: 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  he cursor positi
5a30: 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  on" means that.*
5a40: 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69  * the location i
5a50: 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72  n the btree is r
5a60: 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63  emembered in suc
5a70: 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20  h a way that it 
5a80: 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20  can be.** moved 
5a90: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65  back to the same
5aa0: 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20   spot after the 
5ab0: 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d  btree has been m
5ac0: 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a  odified.  This.*
5ad0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
5ae0: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
5af0: 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69  cursor pExcept i
5b00: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
5b10: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66   the.** table, f
5b20: 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74  or example in Bt
5b30: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
5b40: 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a  treeInsert()..**
5b50: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
5b60: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
5b70: 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
5b80: 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
5b90: 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72   such .** cursor
5ba0: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68  s should have th
5bb0: 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  eir BTCF_Multipl
5bc0: 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65  e flag set.  The
5bd0: 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a   btreeCursor().*
5be0: 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63  * routine enforc
5bf0: 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54  es that rule.  T
5c00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
5c10: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c   needs to be cal
5c20: 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  led in.** the un
5c30: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e  common case when
5c40: 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65   pExpect has the
5c50: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
5c60: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
5c70: 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20  f pExpect!=NULL 
5c80: 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  and if no other 
5c90: 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e  cursors are foun
5ca0: 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f  d on the same ro
5cb0: 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e  ot-page,.** then
5cc0: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
5cd0: 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65  le flag on pExpe
5ce0: 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74  ct is cleared, t
5cf0: 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a  o avoid another.
5d00: 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c  ** pointless cal
5d10: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
5d20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  e..**.** Impleme
5d30: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5d40: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5d50: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
5d60: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
5d70: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
5d80: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
5d90: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
5da0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
5db0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5dc0: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5dd0: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5de0: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5df0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5e00: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5e10: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5e20: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5e30: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5e40: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5e50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5e60: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
5e80: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
5e90: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
5ea0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
5eb0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5ec0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5ed0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5ee0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5ef0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5f00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
5f10: 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65   p ) return save
5f20: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c  CursorsOnList(p,
5f30: 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29   iRoot, pExcept)
5f40: 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20  ;.  if( pExcept 
5f50: 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c  ) pExcept->curFl
5f60: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c  ags &= ~BTCF_Mul
5f70: 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  tiple;.  return 
5f80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5f90: 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75   This helper rou
5fa0: 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43  tine to saveAllC
5fb0: 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20  ursors does the 
5fc0: 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73  actual work of s
5fd0: 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72  aving.** the cur
5fe0: 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e  sors if and when
5ff0: 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75   a cursor is fou
6000: 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  nd that actually
6010: 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67   requires saving
6020: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20  ..** The common 
6030: 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20  case is that no 
6040: 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20  cursors need to 
6050: 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69  be saved, so thi
6060: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
6070: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20  broken out from 
6080: 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76  its caller to av
6090: 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
60a0: 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f  stack pointer mo
60b0: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  vement..*/.stati
60c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
60d0: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
60e0: 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72  sOnList(.  BtCur
60f0: 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  sor *p,         
6100: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72  /* The first cur
6110: 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73  sor that needs s
6120: 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  aving */.  Pgno 
6130: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
6140: 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72  /* Only save cur
6150: 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52  sor with this iR
6160: 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66  oot. Save all if
6170: 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72   zero */.  BtCur
6180: 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20  sor *pExcept    
6190: 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74  /* Do not save t
61a0: 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  his cursor */.){
61b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
61c0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
61d0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
61e0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b  oRoot==iRoot) ){
61f0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
6200: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6210: 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
6220: 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
6230: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
6240: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
6250: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
6260: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
6270: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20  K!=rc ){.       
6280: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
62a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
62b0: 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e  tcase( p->iPage>
62c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
62d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
62e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
62f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6300: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6310: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6320: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6340: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6350: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6360: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6370: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6380: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6390: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
63a0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
63b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
63c0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
63d0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
63e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
63f0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6400: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6410: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6420: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6430: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6440: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6450: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6460: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6470: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6480: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6490: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
64a0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
64b0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
64c0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
64d0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
64e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
64f0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6500: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6510: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6520: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6530: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6540: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6550: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6560: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6580: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6590: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
65a0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
65b0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
65d0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
65e0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
65f0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6600: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6610: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6620: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6650: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6660: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6670: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6680: 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61   key */.  char a
6690: 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20  Space[200];     
66a0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61       /* Temp spa
66b0: 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
66c0: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
66d0: 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46  oc */.  char *pF
66e0: 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ree = 0;..  if( 
66f0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
6700: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
6710: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
6720: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
6730: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
6740: 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20  edRecord(.      
6750: 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
6760: 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66  , aSpace, sizeof
6770: 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65  (aSpace), &pFree
6780: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
6790: 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
67a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
67b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
67c0: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
67d0: 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
67e0: 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b  o, (int)nKey, pK
67f0: 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
6800: 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e    if( pIdxKey->n
6810: 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Field==0 ){.    
6820: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6830: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6840: 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20  db, pFree);.    
6850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6870: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
6880: 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
6890: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
68a0: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
68b0: 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
68c0: 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
68d0: 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65  Res);.  if( pFre
68e0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
68f0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6900: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
6910: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6920: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
6930: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
6940: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
6950: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
6960: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
6970: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
6980: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6990: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
69a0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
69b0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
69c0: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
69d0: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
69e0: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
69f0: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
6a00: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
6a10: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
6a20: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6a30: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
6a40: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
6a50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
6a70: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
6a80: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
6a90: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
6aa0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69  nt rc;.  int ski
6ab0: 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
6ac0: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
6ad0: 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
6ae0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6af0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6b00: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
6b10: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6b20: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
6b30: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
6b40: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  skipNext;.  }.  
6b50: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6b60: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
6b70: 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74   rc = btreeMovet
6b80: 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b  o(pCur, pCur->pK
6b90: 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  ey, pCur->nKey, 
6ba0: 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20  0, &skipNext);. 
6bb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6bc0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
6bd0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
6be0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
6bf0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
6c00: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6c10: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
6c20: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
6c30: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
6c40: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  ;.    pCur->skip
6c50: 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74  Next |= skipNext
6c60: 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
6c70: 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72  skipNext && pCur
6c80: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6c90: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  _VALID ){.      
6ca0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6cb0: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
6cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6cd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
6ce0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
6cf0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
6d00: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
6d10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
6d20: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
6d30: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6d40: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
6d50: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
6d60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
6d70: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
6d80: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
6d90: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
6da0: 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69  ition where.** i
6db0: 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65  t was last place
6dc0: 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69  d, or has been i
6dd0: 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61  nvalidated for a
6de0: 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e  ny other reason.
6df0: 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20  .** Cursors can 
6e00: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
6e10: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
6e20: 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65  ing at is delete
6e30: 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e  d out.** from un
6e40: 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78  der them, for ex
6e50: 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d  ample.  Cursor m
6e60: 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69  ight also move i
6e70: 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20  f a btree.** is 
6e80: 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  rebalanced..**.*
6e90: 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
6ea0: 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55  outine with a NU
6eb0: 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65  LL cursor pointe
6ec0: 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e  r returns false.
6ed0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
6ee0: 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42  eparate sqlite3B
6ef0: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
6f00: 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72  e() routine to r
6f10: 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a  estore a cursor.
6f20: 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65  ** back to where
6f30: 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
6f40: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
6f50: 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f  returns true..*/
6f60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
6f70: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
6f80: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6f90: 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
6fa0: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6fb0: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALID;.}../*.** T
6fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
6fd0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
6fe0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
6ff0: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
7000: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
7010: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
7020: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
7030: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
7040: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7050: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7060: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7070: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
7080: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
7090: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
70a0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
70b0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
70c0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
70d0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
70e0: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
70f0: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7100: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7110: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7120: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7130: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7140: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7150: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7160: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7170: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7180: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7190: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
71a0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
71b0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
71c0: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
71d0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
71e0: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
71f0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7200: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7210: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7220: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7230: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7240: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7260: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7270: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7280: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7290: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
72a0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
72b0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
72c0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
72d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
72e0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
72f0: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7300: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7320: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
7330: 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
7340: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
7350: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7360: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
7370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7380: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
7390: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68  ./*.** Provide h
73a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73  ints to the curs
73b0: 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75  or.  The particu
73c0: 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28  lar hint given (
73d0: 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20  and the type.** 
73e0: 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  and number of th
73f0: 65 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65  e varargs parame
7400: 74 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69  ters) is determi
7410: 6e 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74  ned by the eHint
7420: 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  Type.** paramete
7430: 72 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69  r.  See the defi
7440: 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42  nitions of the B
7450: 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72  TREE_HINT_* macr
7460: 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  os for details..
7470: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
7480: 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42  treeCursorHint(B
7490: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
74a0: 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e  nt eHintType, ..
74b0: 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e  .){.  /* Used on
74c0: 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61  ly by system tha
74d0: 74 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65  t substitute the
74e0: 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65  ir own storage e
74f0: 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69  ngine */.}.#endi
7500: 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  f../*.** Provide
7510: 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74   flag hints to t
7520: 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f  he cursor..*/.vo
7530: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7540: 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42  ursorHintFlags(B
7550: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
7560: 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73  nsigned x){.  as
7570: 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53  sert( x==BTREE_S
7580: 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52  EEK_EQ || x==BTR
7590: 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78  EE_BULKLOAD || x
75a0: 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68  ==0 );.  pCur->h
75b0: 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69  ints = x;.}...#i
75c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
75d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
75e0: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
75f0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
7600: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
7610: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
7620: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
7630: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
7640: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
7650: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
7660: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
7670: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
7680: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
7690: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
76a0: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
76b0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
76c0: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
76d0: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
76e0: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
76f0: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
7700: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
7710: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
7720: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
7730: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
7740: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7750: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
7760: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
7770: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
7780: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
7790: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
77a0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
77b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
77c0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
77d0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
77e0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
77f0: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
7800: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
7810: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
7820: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
7830: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
7840: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
7850: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
7860: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
7870: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
7880: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
7890: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
78a0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
78b0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
78c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
78d0: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
78e0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
78f0: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
7900: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
7910: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
7920: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
7930: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
7940: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
7950: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
7960: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
7970: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
7980: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
7990: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
79a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
79b0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
79c0: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
79d0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
79e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
79f0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
7a00: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
7a10: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
7a20: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
7a30: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
7a40: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
7a50: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7a60: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
7a70: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
7a80: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
7a90: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
7aa0: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
7ab0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
7ac0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
7ad0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
7ae0: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
7af0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7b00: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7b10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
7b20: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
7b30: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
7b40: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
7b50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7b60: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7b70: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
7b80: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
7b90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
7ba0: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
7bb0: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
7bc0: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
7bd0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
7be0: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
7bf0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
7c00: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
7c10: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
7c20: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
7c30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
7c40: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7c50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7c60: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
7c70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
7c80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
7c90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
7ca0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
7cb0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
7cc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7cd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
7ce0: 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
7cf0: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rn;.  }.  offset
7d00: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
7d10: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
7d20: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
7d30: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7d40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7d50: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
7d60: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
7d70: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
7d80: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
7d90: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
7da0: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
7db0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7dc0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
7dd0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
7de0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
7df0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7e00: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
7e10: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
7e20: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
7e30: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
7e40: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
7e50: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
7e60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7e70: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
7e80: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
7e90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7ea0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
7eb0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
7ec0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
7ed0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
7ee0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
7ef0: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
7f00: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
7f10: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
7f20: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
7f30: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
7f40: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
7f60: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
7f70: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
7f80: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
7f90: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
7fa0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
7fb0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
7fc0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
7fd0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
7fe0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
7ff0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8000: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8010: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8020: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8030: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8040: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8050: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8060: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8070: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8080: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8090: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
80a0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
80b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
80c0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
80d0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
80e0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
80f0: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8100: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8120: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8130: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8140: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8150: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8160: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8170: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8180: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8190: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
81a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
81b0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
81c0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
81d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
81e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
81f0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8200: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8210: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8220: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8230: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8240: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8250: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8260: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8270: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8280: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8290: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
82a0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
82b0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
82c0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
82d0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
82e0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
82f0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8300: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8310: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8320: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8330: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8340: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8350: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8360: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8370: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8390: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
83a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
83b0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
83c0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
83d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
83e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
83f0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
8400: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8410: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
8420: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
8430: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8440: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
8450: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
8460: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
8470: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
8480: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
8490: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
84a0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
84b0: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
84c0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
84d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
84e0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
84f0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
8500: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
8510: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
8520: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
8530: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
8540: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
8550: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
8560: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
8570: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
8580: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8590: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
85a0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
85b0: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
85c0: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
85d0: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
85e0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
85f0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
8600: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8610: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8620: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8630: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
8640: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
8650: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
8660: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
8670: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
8680: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
8690: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
86a0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
86b0: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
86c0: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
86d0: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
86e0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
86f0: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
8700: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
8710: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
8720: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
8730: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
8740: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
8750: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
8760: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
8770: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
8780: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
8790: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
87a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
87b0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
87c0: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
87d0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
87e0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
87f0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8800: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8820: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8830: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8840: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8850: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8860: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8870: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
8880: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8890: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
88a0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
88b0: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
88c0: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
88d0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
88e0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
88f0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
8900: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
8910: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
8920: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
8930: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
8940: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
8950: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
8960: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
8970: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
8980: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
8990: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
89a0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
89b0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
89c0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
89d0: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
89e0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
89f0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
8a00: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
8a10: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
8a20: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
8a30: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
8a40: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
8a50: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
8a60: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8a70: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
8a80: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
8a90: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
8aa0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
8ab0: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
8ac0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
8ad0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
8ae0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
8af0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
8b00: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8b10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
8b20: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
8b30: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
8b40: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
8b50: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
8b60: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
8b70: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8b80: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
8b90: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8ba0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
8bb0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8bc0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8bd0: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
8be0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
8bf0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8c00: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
8c10: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
8c20: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8c30: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
8c40: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
8c50: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8c60: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8c70: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
8c80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8c90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
8ca0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
8cb0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
8cc0: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
8cd0: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
8ce0: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
8cf0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
8d00: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
8d10: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
8d20: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
8d30: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
8d40: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
8d50: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
8d60: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
8d70: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
8d80: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
8d90: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
8da0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
8db0: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
8dc0: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
8dd0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
8de0: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
8df0: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
8e00: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
8e10: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
8e20: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
8e30: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
8e40: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
8e50: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
8e60: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
8e70: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
8e80: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
8e90: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
8ea0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8eb0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8ec0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8ed0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8ef0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8f00: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8f10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8f20: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8f30: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8f40: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
8f50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8f60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8f70: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8f80: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
8f90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8fa0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8fb0: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
8fc0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
8fd0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8fe0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
8ff0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9000: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
9010: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
9020: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
9030: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
9040: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
9050: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
9060: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
9070: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
9080: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9090: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
90a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
90b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
90c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
90d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9100: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9110: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9120: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9130: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9140: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9150: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9160: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9170: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9180: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9190: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
91a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
91b0: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
91c0: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91e0: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
91f0: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
9200: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9210: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9220: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9230: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9240: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
9250: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
9260: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
9270: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
9280: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
9290: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
92a0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
92b0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
92c0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
92d0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
92e0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
92f0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
9300: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
9310: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9320: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9330: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9340: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
9350: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
9360: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
9370: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
9380: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9390: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
93a0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
93b0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
93c0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
93d0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
93e0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
93f0: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
9400: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9410: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9420: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
9430: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
9440: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
9450: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
9460: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
9470: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
9480: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
9490: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
94a0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
94b0: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
94c0: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
94d0: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
94e0: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
94f0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
9500: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
9510: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
9520: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
9530: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
9540: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9550: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
9560: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
9570: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
9580: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
9590: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
95a0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
95b0: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
95c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
95d0: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
95e0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
95f0: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
9600: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
9610: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
9620: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
9630: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
9640: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
9650: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9660: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
9670: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
9680: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
9690: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
96a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
96b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
96c0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
96d0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
96e0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
96f0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
9700: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
9710: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
9720: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
9730: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
9740: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
9750: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
9760: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
9770: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
9780: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
9790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
97a0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
97b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
97c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
97d0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
97e0: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
97f0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
9800: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
9810: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
9820: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9830: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9840: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9850: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9860: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9870: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9880: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9890: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
98a0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
98b0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
98c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
98d0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
98f0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
9900: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
9910: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
9920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9930: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9940: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
9950: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9960: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9970: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9980: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9990: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
99a0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
99b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
99c0: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
99d0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
99e0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
99f0: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
9a00: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
9a10: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
9a20: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
9a30: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
9a40: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
9a50: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
9a60: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
9a70: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
9a80: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9a90: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
9aa0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
9ab0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9ac0: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
9ad0: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
9ae0: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
9af0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
9b00: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
9b10: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
9b20: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9b30: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9b40: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9b50: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9b60: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9b70: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9b80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9b90: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9ba0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
9bb0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
9bc0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
9bd0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
9be0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
9bf0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
9c00: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
9c10: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
9c20: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
9c30: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9c40: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9c50: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9c60: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9c70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9c80: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9c90: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9ca0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9cb0: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9cc0: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9cd0: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
9cf0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
9d00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9d10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9d20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9d30: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
9d40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9d50: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
9d60: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
9d70: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
9d80: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9d90: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9da0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9db0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
9dc0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
9dd0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
9de0: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
9df0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
9e00: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
9e10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
9e20: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
9e30: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
9e40: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
9e50: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
9e60: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
9e70: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
9e80: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9e90: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
9ea0: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
9eb0: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
9ec0: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
9ed0: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
9ee0: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
9ef0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
9f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
9f10: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
9f20: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
9f30: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
9f40: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
9f50: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
9f60: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
9f70: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
9f80: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
9f90: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
9fa0: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
9fb0: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
9fc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
9fd0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
9fe0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
9ff0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a000: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a010: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
a020: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
a030: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
a040: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a070: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a080: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
a090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
a0c0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
a0d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a0e0: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
a0f0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
a100: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
a110: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
a120: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
a130: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
a140: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
a150: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
a160: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
a170: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
a180: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
a190: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
a1a0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
a1b0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
a1c0: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
a1d0: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
a1e0: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
a1f0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
a200: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
a210: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
a220: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
a230: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
a240: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
a250: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
a260: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
a270: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
a280: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
a290: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
a2a0: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
a2b0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
a2c0: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
a2d0: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
a2e0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a2f0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
a300: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
a310: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
a320: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
a330: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
a340: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
a350: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
a360: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
a370: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
a380: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
a390: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
a3a0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
a3b0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
a3c0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
a3d0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
a3e0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
a3f0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a400: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a410: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
a420: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a430: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a440: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
a450: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a460: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
a470: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
a480: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
a490: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
a4a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
a4b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
a4c0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
a4d0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
a4e0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
a4f0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
a500: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
a510: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
a520: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
a530: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
a540: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a550: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a560: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
a570: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a580: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a590: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
a5a0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
a5b0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
a5c0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
a5d0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
a5e0: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
a5f0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
a600: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
a610: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
a620: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
a630: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
a640: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
a650: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
a660: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
a670: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a680: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
a690: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
a6a0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a6b0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a6c0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a6e0: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a6f0: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
a700: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a710: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a720: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a730: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a740: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a750: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a760: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a770: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a780: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a790: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a7a0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a7b0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a7c0: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a7d0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a7e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a7f0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a800: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a810: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a820: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a830: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a850: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a860: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
a870: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
a880: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
a890: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
a8a0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
a8b0: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
a8c0: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
a8d0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a8e0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
a8f0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
a900: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
a910: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
a920: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a930: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
a940: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
a950: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a960: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
a970: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
a980: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
a990: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
a9a0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
a9b0: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
a9c0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
a9d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a9e0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
a9f0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
aa00: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
aa10: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
aa20: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
aa30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aa40: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
aa50: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
aa60: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
aa70: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
aa80: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
aa90: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
aaa0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
aab0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
aac0: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
aad0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
aae0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
aaf0: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
ab00: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
ab10: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
ab20: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
ab30: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
ab40: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
ab50: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
ab60: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
ab70: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
ab80: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
ab90: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
aba0: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
abb0: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
abc0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
abd0: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
abe0: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
abf0: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
ac00: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
ac10: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
ac20: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
ac30: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
ac40: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
ac50: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
ac60: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
ac70: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
ac80: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
ac90: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
aca0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
acb0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
acc0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
acd0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
ace0: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
acf0: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
ad00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ad10: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
ad20: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
ad30: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
ad40: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
ad50: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
ad60: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
ad70: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
ad80: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
ad90: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
ada0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
adb0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
adc0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
add0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
ade0: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
adf0: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
ae00: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
ae10: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ae20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
ae30: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
ae40: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
ae50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ae70: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
ae80: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
aea0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
aeb0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
aec0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
aed0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
aee0: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
aef0: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
af00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
af10: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
af20: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
af30: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
af40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
af50: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
af60: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
af70: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
af80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af90: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
afa0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
afb0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afd0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
afe0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
aff0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
b000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b020: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
b030: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b040: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
b050: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
b060: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
b070: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
b080: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
b090: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
b0a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b0b0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
b0c0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
b0d0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
b0e0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
b0f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
b100: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
b110: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
b120: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
b130: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b140: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b150: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
b160: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b170: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b180: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b190: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b1c0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b1d0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b1e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1f0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b200: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b210: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b220: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b230: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b240: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b250: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b260: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b270: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b280: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b290: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b2a0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b2b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b2c0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b2d0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
b2e0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
b2f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b300: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
b310: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
b320: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
b330: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
b340: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
b350: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
b360: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
b370: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
b380: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
b390: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
b3a0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
b3b0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
b3c0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
b3d0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
b3e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b3f0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
b400: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b410: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
b420: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
b430: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
b440: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
b450: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
b460: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
b470: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
b480: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
b490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
b4a0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
b4b0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
b4c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4e0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4f0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
b500: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
b510: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
b520: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b530: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
b540: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
b550: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
b560: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
b570: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
b580: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
b590: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b5a0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b5b0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
b5c0: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
b5d0: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
b5e0: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b5f0: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
b600: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b610: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
b620: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
b630: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
b640: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
b650: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
b660: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
b670: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
b680: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b690: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
b6a0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
b6b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
b6c0: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
b6d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b6e0: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
b6f0: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
b700: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
b710: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
b720: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
b730: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
b740: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
b750: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
b760: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
b770: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
b780: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b790: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
b7a0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
b7b0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
b7c0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
b7d0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
b7e0: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
b7f0: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
b800: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
b810: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b820: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b830: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
b840: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
b850: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
b860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b880: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b890: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b8a0: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
b8b0: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
b8c0: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
b8d0: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
b8e0: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
b8f0: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
b900: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
b910: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b920: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
b930: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
b940: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
b950: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
b960: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
b970: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
b980: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
b990: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b9a0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
b9b0: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
b9c0: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
b9d0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
b9e0: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
b9f0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
ba00: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
ba10: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ba20: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
ba30: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
ba40: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
ba50: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
ba60: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
ba70: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
ba80: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
ba90: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
baa0: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
bab0: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
bac0: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
bad0: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
bae0: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
baf0: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
bb00: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
bb10: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
bb20: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
bb30: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
bb40: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
bb50: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
bb60: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
bb70: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
bb80: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
bb90: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
bba0: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
bbb0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
bbc0: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
bbd0: 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
bbe0: 28 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a  ( pc>0 );.  do{.
bbf0: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
bc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bc10: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
bc20: 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  t */.    /* EVID
bc30: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36  ENCE-OF: R-06866
bc40: 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b  -39125 Freeblock
bc50: 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e  s are always con
bc60: 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20  nected in order 
bc70: 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61  of.    ** increa
bc80: 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a  sing offset. */.
bc90: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
bca0: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41  eSize-4 || pc<iA
bcb0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a  ddr+4 ){.      *
bcc0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
bcd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
bce0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
bcf0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
bd00: 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33  -OF: R-22710-533
bd10: 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64  28 The third and
bd20: 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66   fourth bytes of
bd30: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65   each.    ** fre
bd40: 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69  eblock form a bi
bd50: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
bd60: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69   which is the si
bd70: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c  ze of the freebl
bd80: 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79  ock.    ** in by
bd90: 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  tes, including t
bda0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
bdb0: 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20  . */.    size = 
bdc0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
bdd0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
bde0: 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74  (x = size - nByt
bdf0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  e)>=0 ){.      t
be00: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
be10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
be20: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
be30: 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c  f( pc < pPg->cel
be40: 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e  lOffset+2*pPg->n
be50: 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20  Cell || size+pc 
be60: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
be70: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
be80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
be90: 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  PT;.        retu
bea0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
beb0: 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20  e if( x<4 ){.   
bec0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
bed0: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
bee0: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
bef0: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
bf00: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
bf10: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
bf20: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
bf30: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
bf40: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
bf50: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
bf60: 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b  ]>57 ) return 0;
bf70: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  ..        /* Rem
bf80: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
bf90: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
bfa0: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
bfb0: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
bfc0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
bfd0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
bfe0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
bff0: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
c000: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
c010: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
c020: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
c030: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
c040: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
c050: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
c060: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
c070: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
c080: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
c090: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
c0a0: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
c0b0: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
c0c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
c0d0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
c0e0: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
c0f0: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
c100: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
c110: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
c120: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
c130: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
c140: 0a 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b  .  }while( pc );
c150: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
c160: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
c170: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
c180: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
c190: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
c1a0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
c1b0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c1c0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
c1d0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
c1e0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
c1f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
c200: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
c210: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
c220: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
c230: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
c240: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
c250: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
c260: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
c270: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
c280: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
c290: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
c2a0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
c2b0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
c2c0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
c2d0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
c2e0: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
c2f0: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
c300: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
c310: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
c320: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
c330: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
c340: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
c350: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c360: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
c370: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
c380: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
c390: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
c3a0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
c3b0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
c3c0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
c3d0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
c3e0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
c3f0: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
c400: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
c410: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
c420: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
c430: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
c440: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c450: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
c460: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
c470: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
c480: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
c490: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
c4a0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
c4b0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
c4c0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c4f0: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
c500: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
c510: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c520: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
c530: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
c540: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
c550: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
c560: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
c570: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
c580: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
c590: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
c5a0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
c5b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
c5c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
c5d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c5e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
c5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
c620: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
c630: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
c640: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
c650: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
c660: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
c670: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
c680: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
c690: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
c6a0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
c6b0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
c6c0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
c6d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c6e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
c6f0: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
c700: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
c710: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
c720: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
c730: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
c740: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
c750: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
c760: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
c770: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
c780: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
c790: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
c7a0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
c7b0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
c7c0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
c7d0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
c7e0: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
c7f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c800: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
c810: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
c820: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
c830: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
c840: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
c850: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
c860: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
c870: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
c880: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
c890: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
c8a0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
c8b0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
c8c0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
c8d0: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
c8e0: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
c8f0: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72  bleSize ); /* Pr
c900: 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49  event by getAndI
c910: 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69  nitPage() */.  i
c920: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
c930: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20    if( top==0 && 
c940: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c950: 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b  leSize==65536 ){
c960: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
c970: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
c980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c990: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c9a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c9b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
c9c0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
c9d0: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
c9e0: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
c9f0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
ca00: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
ca10: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
ca20: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
ca30: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
ca40: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
ca50: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
ca60: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
ca70: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
ca80: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
ca90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
caa0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
cab0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
cac0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
cad0: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
cae0: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
caf0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
cb00: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
cb10: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
cb20: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
cb30: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
cb40: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
cb50: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
cb60: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
cb70: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
cb80: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
cb90: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
cba0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
cbb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cbc0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
cbd0: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
cbe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
cbf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
cc00: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
cc10: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
cc20: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
cc30: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
cc40: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
cc50: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
cc60: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
cc70: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
cc80: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
cc90: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
cca0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
ccb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
ccc0: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
ccd0: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
cce0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
ccf0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
cd00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cd10: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
cd20: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
cd30: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
cd40: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
cd50: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
cd60: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
cd70: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
cd80: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
cd90: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
cda0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
cdb0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
cdc0: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
cdd0: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
cde0: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
cdf0: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
ce00: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
ce10: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
ce20: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
ce30: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
ce40: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
ce50: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
ce60: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ce70: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
ce80: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
ce90: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
cea0: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
ceb0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
cec0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ced0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
cee0: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
cef0: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
cf00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
cf10: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
cf20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
cf30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
cf40: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
cf50: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
cf60: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
cf70: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
cf80: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
cf90: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
cfa0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
cfb0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
cfc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
cfd0: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
cfe0: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
cff0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
d000: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
d010: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
d020: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
d030: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
d040: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
d050: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
d060: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
d070: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
d080: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
d090: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
d0a0: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
d0b0: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
d0c0: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
d0d0: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
d0e0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
d0f0: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
d100: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
d110: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
d120: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
d130: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
d140: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
d150: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d160: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
d170: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
d180: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
d190: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d1a0: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
d1b0: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
d1c0: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d1f0: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
d200: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
d210: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d240: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
d250: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d280: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
d290: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
d2a0: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
d2d0: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
d2e0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
d2f0: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
d300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d310: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
d320: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
d330: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
d340: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d350: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
d360: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
d370: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
d380: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
d390: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
d3a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d3b0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
d3c0: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
d3d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d3e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
d3f0: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
d400: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
d410: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d420: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d430: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
d440: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
d450: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
d460: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
d470: 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  || iStart>=pPage
d480: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
d490: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
d4a0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  e );.  assert( C
d4b0: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e  ORRUPT_DB || iEn
d4c0: 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  d <= pPage->pBt-
d4d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
d4e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d4f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d500: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d510: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a  ;.  assert( iSiz
d520: 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=4 );   /* Min
d530: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
d540: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
d550: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
d560: 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  ;..  /* Overwrit
d570: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
d580: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
d590: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
d5a0: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74  _delete.  ** opt
d5b0: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
d5c0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  /.  if( pPage->p
d5d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
d5e0: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
d5f0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
d600: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
d610: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20   iSize);.  }..  
d620: 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66  /* The list of f
d630: 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  reeblocks must b
d640: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
d650: 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20  rder.  Find the 
d660: 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68  .  ** spot on th
d670: 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74  e list where iSt
d680: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  art should be in
d690: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68  serted..  */.  h
d6a0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
d6b0: 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20  ffset;.  iPtr = 
d6c0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64  hdr + 1;.  if( d
d6d0: 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26  ata[iPtr+1]==0 &
d6e0: 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20  & data[iPtr]==0 
d6f0: 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20  ){.    iFreeBlk 
d700: 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75  = 0;  /* Shortcu
d710: 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  t for the case w
d720: 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74  hen the freelist
d730: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d   is empty */.  }
d740: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
d750: 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74   (iFreeBlk = get
d760: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
d770: 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c  ]))>0 && iFreeBl
d780: 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  k<iStart ){.    
d790: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
d7a0: 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53  Ptr+4 ) return S
d7b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d7c0: 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d  PT;.      iPtr =
d7d0: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
d7e0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
d7f0: 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e  k>iLast ) return
d800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d810: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
d820: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
d830: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
d840: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
d850: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
d860: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
d870: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
d880: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
d890: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
d8a0: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
d8b0: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
d8c0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
d8d0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
d8e0: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
d8f0: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
d900: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
d910: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
d920: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
d930: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
d940: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
d950: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
d960: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
d970: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
d980: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
d990: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
d9a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d9b0: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
d9c0: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
d9d0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
d9e0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
d9f0: 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42  iEnd > pPage->pB
da00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20  t->usableSize ) 
da10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
da20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
da30: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
da40: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69   iStart;.      i
da50: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
da60: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
da70: 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  k]);.    }.  .  
da80: 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20    /* If iPtr is 
da90: 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63  another freebloc
daa0: 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69  k (that is, if i
dab0: 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66  Ptr is not the f
dac0: 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70  reelist.    ** p
dad0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
dae0: 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20  ge header) then 
daf0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
db00: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
db10: 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65  .    ** coalesce
db20: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
db30: 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  f iPtr..    */. 
db40: 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b     if( iPtr>hdr+
db50: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
db60: 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20  PtrEnd = iPtr + 
db70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
db80: 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Ptr+2]);.      i
db90: 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53  f( iPtrEnd+3>=iS
dba0: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
dbb0: 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61  if( iPtrEnd>iSta
dbc0: 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rt ) return SQLI
dbd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dbe0: 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b  .        nFrag +
dbf0: 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45  = iStart - iPtrE
dc00: 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a  nd;.        iSiz
dc10: 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b  e = iEnd - iPtr;
dc20: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
dc30: 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a  = iPtr;.      }.
dc40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
dc50: 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20  rag>data[hdr+7] 
dc60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dc70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
dc80: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
dc90: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66   nFrag;.  }.  if
dca0: 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79  ( iStart==get2by
dcb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
dcc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
dcd0: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  ew freeblock is 
dce0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
dcf0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
dd00: 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a  tent area,.    *
dd10: 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64  * so just extend
dd20: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
dd30: 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68  t area rather th
dd40: 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65  an create anothe
dd50: 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73  r.    ** freelis
dd60: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69  t entry */.    i
dd70: 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  f( iPtr!=hdr+1 )
dd80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dd90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dda0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ddb0: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
ddc0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
ddd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
dde0: 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
ddf0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
de00: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
de10: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
de20: 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
de30: 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
de40: 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79  art);.    put2by
de50: 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  te(&data[iStart]
de60: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
de70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
de80: 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
de90: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
dea0: 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69  nFree += iOrigSi
deb0: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ze;.  return SQL
dec0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ded0: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
dee0: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
def0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
df00: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
df10: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
df20: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
df30: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
df40: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
df50: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
df60: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
df70: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
df80: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
df90: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
dfa0: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
dfb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
dfc0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
dfd0: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
dfe0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
dff0: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
e000: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
e010: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
e020: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
e030: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
e040: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
e050: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
e060: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
e070: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
e080: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
e090: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
e0a0: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
e0b0: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
e0c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
e0d0: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
e0e0: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
e0f0: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
e100: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e110: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
e120: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
e130: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
e140: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
e150: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
e160: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
e170: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
e180: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
e190: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
e1a0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50  Page->leaf;.  pP
e1b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e1c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20   cellSizePtr;.  
e1d0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
e1e0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
e1f0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
e200: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
e210: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e220: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
e230: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
e240: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
e250: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
e260: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
e270: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e280: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
e290: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
e2a0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
e2b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
e2c0: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
e2d0: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
e2e0: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
e2f0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
e300: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
e310: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
e320: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
e330: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
e340: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e350: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66  tKey = 1;.    if
e360: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
e370: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
e380: 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20  tKeyLeaf = 1;.  
e390: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
e3a0: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
e3b0: 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d  seCellPtr;.    }
e3c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
e3d0: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e3e0: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  0;.      pPage->
e3f0: 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
e400: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
e410: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
e420: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
e430: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
e440: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20  ayload;.    }.  
e450: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
e460: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
e470: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e480: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e490: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
e4a0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
e4b0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
e4c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e4d0: 52 2d 32 37 32 32 35 2d 35 33 39 33 36 20 41 20  R-27225-53936 A 
e4e0: 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73  value of 2 means
e4f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20   the page is an 
e500: 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20  interior.    ** 
e510: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
e520: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
e530: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29  ( (PTF_ZERODATA)
e540: 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==2 );.    /* EV
e550: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35  IDENCE-OF: R-165
e560: 37 31 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65  71-11615 A value
e570: 20 6f 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65   of 10 means the
e580: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
e590: 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74      ** index b-t
e5a0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
e5b0: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
e5c0: 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  RODATA|PTF_LEAF)
e5d0: 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67  ==10 );.    pPag
e5e0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
e5f0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e600: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  Leaf = 0;.    pP
e610: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e620: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e630: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
e640: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e650: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
e660: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e670: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
e680: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
e690: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e6a0: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
e6b0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
e6c0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
e6d0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
e6e0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
e6f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e700: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e710: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
e720: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
e730: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
e740: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
e750: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e760: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e770: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
e780: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
e790: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
e7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e7b0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
e7c0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
e7d0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
e7e0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
e7f0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
e800: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
e810: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
e820: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
e830: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
e840: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
e850: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
e860: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
e870: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
e880: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
e890: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
e8a0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
e8b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e8c0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
e8d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e8e0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
e8f0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
e900: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e910: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
e920: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e930: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e940: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e950: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e960: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
e970: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
e980: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e990: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9a0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
e9b0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e9c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e9d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e9e0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
e9f0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
ea00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
ea10: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
ea20: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
ea30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ea40: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
ea50: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
ea60: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
ea70: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
ea80: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
ea90: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
eaa0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
eab0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
eac0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
ead0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
eae0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
eaf0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
eb00: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
eb10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
eb20: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
eb30: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
eb40: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
eb50: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
eb60: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
eb70: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
eb80: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
eb90: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
eba0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
ebb0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
ebc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
ebd0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
ebe0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
ebf0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
ec00: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ec10: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec20: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
ec30: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
ec40: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
ec50: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
ec60: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
ec70: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
ec80: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
ec90: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
eca0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
ecb0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
ecc0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
ecd0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ece0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
ecf0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
ed00: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
ed10: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
ed20: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
ed30: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
ed40: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
ed50: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
ed60: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
ed70: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
ed80: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
ed90: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
eda0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
edb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
edc0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
edd0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
ede0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
edf0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
ee00: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
ee10: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
ee20: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ee30: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
ee40: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
ee50: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
ee60: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
ee70: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
ee80: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
ee90: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
eea0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
eeb0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
eec0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
eed0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
eee0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
eef0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ef00: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ef10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ef20: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
ef30: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
ef40: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
ef50: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
ef60: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
ef70: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
ef80: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ef90: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
efa0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
efb0: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
efc0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
efd0: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
efe0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
eff0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
f000: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f010: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
f020: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
f030: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f040: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
f050: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
f060: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
f070: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
f080: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
f090: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
f0a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
f0b0: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
f0c0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
f0d0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
f0e0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
f0f0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
f100: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
f110: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f120: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f130: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
f140: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
f150: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
f160: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f170: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
f180: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
f190: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
f1a0: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
f1b0: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
f1c0: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
f1d0: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
f1e0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
f1f0: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
f200: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
f210: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f220: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
f230: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
f240: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
f250: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
f260: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
f270: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
f280: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
f290: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
f2a0: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
f2b0: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
f2c0: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
f2d0: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
f2e0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
f2f0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
f300: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
f310: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f320: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f330: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f340: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f350: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f360: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f370: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f380: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f390: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f3a0: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f3b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f3c0: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f3d0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f3e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f3f0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f400: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f410: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f420: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f430: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f440: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f450: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f460: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f470: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f480: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
f490: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
f4a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
f4b0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
f4c0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f4d0: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
f4e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f4f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
f500: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
f510: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
f520: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
f530: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
f540: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f550: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
f560: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f570: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
f580: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f590: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f5a0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f5b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f5c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5e0: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
f5f0: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
f600: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f610: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f620: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
f630: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f640: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
f650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f660: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f670: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f680: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f690: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f6a0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
f6b0: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
f6c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
f6d0: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
f6e0: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
f6f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f700: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
f710: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f720: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
f730: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
f740: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
f750: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
f760: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
f770: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
f780: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
f790: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
f7a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f7b0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
f7c0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
f7d0: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
f7e0: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
f7f0: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
f800: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
f810: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f820: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
f830: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f840: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f850: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f860: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f870: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f880: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f890: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f8a0: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f8b0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f8c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f8d0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f8e0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f8f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f900: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
f910: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
f920: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
f930: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f950: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
f970: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
f980: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
f990: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
f9a0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
f9b0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
f9c0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
f9d0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
f9e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f9f0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
fa00: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
fa10: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
fa20: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
fa30: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
fa40: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
fa50: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
fa60: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
fa70: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
fa80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fa90: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
faa0: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
fab0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
fac0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
fad0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
fae0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
faf0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
fb00: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
fb10: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
fb20: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
fb30: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
fb40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
fb50: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
fb60: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
fb70: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
fb80: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
fb90: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
fba0: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
fbb0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
fbc0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fbd0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
fbe0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
fbf0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
fc00: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
fc10: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
fc20: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
fc30: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
fc40: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
fc50: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
fc60: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
fc70: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
fc80: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
fc90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
fca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fcb0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
fcc0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
fcd0: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
fce0: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
fcf0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
fd00: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fd10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fd20: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
fd30: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
fd40: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
fd50: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
fd60: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
fd70: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
fd80: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
fd90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
fda0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
fdb0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
fdc0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fdd0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fde0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
fdf0: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
fe00: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
fe10: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
fe20: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fe30: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fe40: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
fe50: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
fe60: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fe70: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
fe80: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
fe90: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
fea0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
feb0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
fec0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
fed0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
fee0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
fef0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ff00: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ff10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ff20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ff30: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
ff40: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ff50: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
ff60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
ff70: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
ff80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
ff90: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
ffa0: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
ffb0: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
ffc0: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
ffd0: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
ffe0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
fff0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
10000 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
10010 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
10020 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
10030 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
10040 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10050 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
10060 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
10070 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
10080 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
10090 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
100a0 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
100b0 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
100c0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
100d0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
100e0 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
100f0 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
10100 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
10110 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
10120 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
10130 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
10140 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
10150 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
10160 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
10170 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
10180 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
10190 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
101a0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
101b0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
101c0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
101d0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
101e0 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
101f0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
10200 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
10210 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
10220 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
10230 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
10240 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
10250 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
10260 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
10270 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10280 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10290 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
102a0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
102b0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
102c0 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
102d0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
102e0 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
102f0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
10300 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
10310 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
10320 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
10330 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
10340 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
10350 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
10360 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
10370 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
10380 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
10390 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
103a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
103b0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
103c0 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
103d0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
103e0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
103f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
10400 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
10410 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
10420 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
10430 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
10440 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
10450 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
10460 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
10470 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
10480 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
10490 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
104a0 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
104b0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
104c0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
104d0 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
104e0 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
104f0 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
10500 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
10510 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
10520 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
10530 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
10540 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
10550 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
10560 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
10570 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
10580 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
10590 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
105a0 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
105b0 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
105c0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
105d0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
105e0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
105f0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
10600 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
10610 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
10620 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10630 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10640 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
10650 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
10660 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
10670 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
10680 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
10690 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
106a0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
106b0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
106c0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
106d0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
106e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
106f0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
10700 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
10710 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
10720 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
10730 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
10740 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
10750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10760 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
10780 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10790 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
107a0 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
107b0 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
107c0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
107d0 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
107e0 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
107f0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
10800 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
10810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10820 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
10830 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
10840 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
10850 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
10860 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
10870 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
10880 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
10890 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
108a0 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
108b0 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
108c0 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
108d0 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
108e0 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
108f0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
10900 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
10910 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
10920 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
10930 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10940 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10950 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
10960 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
10970 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
10980 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
10990 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
109a0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
109b0 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
109c0 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
109d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
109e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
109f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
10a00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
10a10 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
10a20 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
10a30 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
10a40 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
10a50 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
10a60 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
10a70 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
10a80 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
10a90 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
10aa0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
10ab0 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
10ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
10ad0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
10ae0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
10af0 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
10b00 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
10b10 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
10b20 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
10b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
10b40 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10b50 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
10b60 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ize it..**.** If
10b70 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68   pCur!=0 then th
10b80 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
10b90 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20  fetched as part 
10ba0 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  of a moveToChild
10bb0 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20  ().** call.  Do 
10bc0 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
10bd0 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
10be0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
10bf0 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74  ase..** And if t
10c00 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20  he fetch fails, 
10c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
10c20 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72  t decrement pCur
10c30 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ->iPage..**.** T
10c40 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68  he page is fetch
10c50 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65  ed as read-write
10c60 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20   unless pCur is 
10c70 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a  not NULL and is.
10c80 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  ** a read-only c
10c90 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
10ca0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10cb0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
10cc0 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
10cd0 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
10ce0 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
10cf0 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
10d00 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
10d10 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
10d20 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
10d30 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d50 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
10d60 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
10d70 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
10d80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10d90 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
10da0 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
10db0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
10dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
10dd0 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
10de0 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74  ter here */.  Bt
10df0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e10 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69   Cursor to recei
10e20 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  ve the page, or 
10e30 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52  NULL */.  int bR
10e40 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20  eadOnly         
10e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10e60 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
10e70 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  y page */.){.  i
10e80 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
10e90 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
10ea0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10eb0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10ec0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
10ed0 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67  pCur==0 || ppPag
10ee0 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e==&pCur->apPage
10ef0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
10f00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
10f10 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
10f20 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
10f30 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
10f40 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
10f50 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
10f60 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
10f70 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
10f80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10f90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10fa0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10fb0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
10fc0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10fd0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
10fe0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
10ff0 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11000 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
11010 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
11020 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11030 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70  error;.  }.  *pp
11040 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
11050 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
11060 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
11070 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
11080 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
11090 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44    btreePageFromD
110a0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
110b0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72  gno, pBt);.    r
110c0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
110d0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
110e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
110f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
11100 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11110 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
11120 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
11140 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
11150 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
11160 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
11170 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
11180 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11190 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
111a0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
111b0 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
111c0 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
111d0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
111e0 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
111f0 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
11200 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
11210 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
11220 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
11230 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
11240 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
11250 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
11260 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11270 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
11280 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
11290 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
112a0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
112b0 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
112c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
112d0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
112e0 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70  :.  if( pCur ) p
112f0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
11300 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
11310 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11320 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
11330 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
11340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11350 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
11360 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
11370 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
11380 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
11390 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
113a0 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
113b0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
113c0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
113d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
113e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
113f0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
11400 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
11410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11420 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
11430 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11440 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11450 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11460 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
11470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11480 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11490 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
114a0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
114b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
114c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
114d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
114e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
114f0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
11500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
11510 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
11520 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
11530 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
11540 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
11550 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
11560 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
11570 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
11580 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
11590 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
115a0 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
115b0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
115c0 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
115d0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
115e0 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
115f0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
11600 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
11610 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
11620 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
11630 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
11640 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
11650 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
11660 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
11670 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
11680 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
11690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
116a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
116b0 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
116c0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
116d0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
116e0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
116f0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
11700 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
11710 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
11720 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
11730 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
11740 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
11750 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
11760 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
11770 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
11780 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
11790 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
117a0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
117b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117c0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
117d0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
117e0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
117f0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
11800 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11810 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
11820 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
11830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11840 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11850 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
11860 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
11870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
11880 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
11890 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
118a0 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
118b0 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
118c0 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
118d0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
118e0 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
118f0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
11900 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11910 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11920 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
11930 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
11940 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
11950 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
11960 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11970 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
11980 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
11990 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
119a0 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
119b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
119c0 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
119d0 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
119e0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
119f0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
11a00 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
11a10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11a20 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
11a30 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
11a40 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
11a50 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
11a60 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11a70 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
11a80 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
11a90 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
11aa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11ab0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11ac0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11ad0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11ae0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
11af0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11b00 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
11b10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
11b20 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
11b30 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
11b40 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
11b50 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
11b60 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
11b70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
11b80 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
11b90 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
11ba0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
11bb0 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
11bc0 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
11bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11be0 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
11bf0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
11c00 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
11c10 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
11c20 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
11c30 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
11c40 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
11c50 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
11c60 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
11c70 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
11c80 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
11c90 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
11ca0 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
11cb0 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
11cc0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
11cd0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
11ce0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11cf0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
11d00 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
11d10 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
11d20 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
11d30 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
11d40 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
11d50 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
11d60 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
11d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11d80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11d90 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11da0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
11db0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11dc0 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
11dd0 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
11de0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
11df0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
11e00 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
11e10 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11e20 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
11e30 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
11e40 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
11e50 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
11e60 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
11e70 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11e80 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
11e90 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
11ea0 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
11eb0 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
11ec0 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
11ed0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
11ee0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11ef0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
11f00 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11f10 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
11f20 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
11f30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
11f40 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11f50 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
11f60 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
11f70 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
11f80 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
11f90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
11fa0 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
11fb0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
11fc0 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
11fd0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
11fe0 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
11ff0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
12000 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
12010 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
12020 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
12030 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
12040 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
12050 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
12060 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12070 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
12080 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
12090 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
120a0 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
120b0 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
120c0 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
120d0 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
120e0 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
120f0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
12100 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
12110 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12120 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
12130 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
12140 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
12150 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
12160 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
12170 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
12180 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
12190 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
121a0 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
121b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
121c0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
121d0 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
121e0 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
121f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
12200 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12210 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
12220 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
12230 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
12240 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
12250 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
12260 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
12270 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
12280 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
12290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
122a0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
122b0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
122c0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
122d0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
122e0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
122f0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
12300 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
12310 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
12320 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
12330 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
12340 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12360 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
12370 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
12380 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
12390 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
123a0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
123b0 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
123c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
123d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
123e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
123f0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
12400 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
12410 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
12420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12430 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
12440 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
12450 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
12460 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
12470 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
12480 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
12490 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
124a0 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
124b0 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
124c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
124d0 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
124e0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
124f0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
12500 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
12510 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
12520 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
12530 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12540 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
12550 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
12560 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
12570 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12580 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
12590 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
125a0 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
125b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
125c0 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
125d0 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
125e0 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
125f0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12610 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
12620 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
12630 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12650 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
12660 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
12670 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
12680 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
12690 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
126a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
126b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126c0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
126d0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
126e0 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
126f0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
12700 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
12710 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
12720 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
12730 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
12740 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
12750 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
12760 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
12770 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
12780 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
12790 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
127a0 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
127b0 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
127c0 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
127d0 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
127e0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
127f0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
12800 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
12810 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
12820 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
12830 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
12840 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
12850 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12860 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
12870 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
12880 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
12890 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
128a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
128b0 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
128c0 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
128d0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
128e0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
128f0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
12900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12910 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
12920 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
12930 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
12940 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
12950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12960 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
12970 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
12980 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
12990 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
129a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
129b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
129c0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
129d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
129e0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
129f0 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
12a00 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
12a10 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
12a20 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
12a30 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
12a40 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
12a50 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
12a60 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
12a70 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
12a80 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
12a90 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
12aa0 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
12ab0 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
12ac0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12ad0 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
12ae0 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12af0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12b00 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
12b10 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
12b20 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
12b30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12b40 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
12b50 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
12b60 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
12b70 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
12b80 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
12b90 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12ba0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
12bb0 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
12bc0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
12bd0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
12be0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
12bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12c00 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
12c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12c20 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
12c30 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
12c40 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
12c50 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
12c60 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
12c70 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
12c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12ca0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
12cb0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
12cf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12d00 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
12d10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12d20 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
12d30 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
12d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12d60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12d70 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
12d80 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
12d90 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
12da0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
12db0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12dc0 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
12dd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12de0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
12df0 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
12e00 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
12e10 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
12e20 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
12e30 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
12e40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12e50 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
12e60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
12e70 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
12e80 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
12e90 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
12ea0 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
12eb0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
12ec0 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
12ed0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
12ee0 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
12ef0 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
12f00 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
12f10 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
12f40 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
12f50 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
12f60 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
12f70 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
12f80 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
12f90 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
12fa0 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
12fb0 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
12fc0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
12fd0 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
12fe0 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
12ff0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
13000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13010 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13020 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
13030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13040 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13050 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
13060 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13070 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
13080 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
13090 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
130a0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
130b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
130c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
130d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
130e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
130f0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
13100 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
13110 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
13120 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13150 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
13160 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13170 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
13180 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
13190 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
131a0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
131b0 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
131c0 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
131d0 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
131e0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
131f0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
13200 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
13210 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
13220 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
13230 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
13240 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
13250 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
13260 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13270 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
13280 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
13290 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
132a0 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
132b0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
132c0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
132d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
132e0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
132f0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
13300 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
13310 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
13320 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
13330 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
13340 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
13350 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
13360 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
13370 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
13380 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
13390 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
133a0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
133b0 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
133c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
133d0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
133e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
133f0 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
13400 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13410 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
13420 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13430 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
13440 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
13450 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
13460 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
13470 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
13480 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
13490 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
134a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
134b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
134c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
134d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
134e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
134f0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
13500 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
13510 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
13530 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
13540 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
13550 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
13560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13570 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
13580 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
13590 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
135a0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
135b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
135c0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
135d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
135e0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
135f0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
13600 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13620 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
13630 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
13640 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
13650 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
13660 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
13670 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13680 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
13690 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
136a0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
136b0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
136c0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
136d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
136e0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
136f0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
13700 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
13710 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
13720 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
13730 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13740 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
13750 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
13760 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
13770 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
13780 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
13790 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
137a0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
137b0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
137c0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
137d0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
137e0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
137f0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
13800 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
13810 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
13820 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
13830 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
13840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13850 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
13860 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
13870 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
13880 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
13890 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
138a0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
138b0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
138c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
138d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
138e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
138f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
13900 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
13910 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
13920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13930 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13940 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
13950 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
13960 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
13970 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13980 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
13990 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
139a0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
139b0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
139c0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
139d0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
139e0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
139f0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
13a00 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
13a10 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
13a20 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
13a30 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
13a40 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
13a50 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
13a60 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
13a70 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
13a80 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
13a90 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
13aa0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
13ab0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13ac0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
13ad0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13ae0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13af0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
13b00 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
13b10 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
13b20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
13b30 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
13b40 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
13b50 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
13b60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
13b70 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
13b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13b90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13ba0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
13bb0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
13bc0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
13bd0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
13be0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
13bf0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
13c00 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
13c10 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
13c20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
13c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
13c40 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
13c50 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
13c60 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
13c70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13c80 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
13c90 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
13ca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13cb0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
13cc0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
13cd0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
13ce0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
13cf0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
13d00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13d10 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
13d20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
13d30 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
13d40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13d50 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
13d60 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
13d70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
13d80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
13d90 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13da0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
13db0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
13dc0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
13dd0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
13de0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
13df0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
13e00 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
13e10 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
13e20 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
13e30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
13e40 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
13e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13e60 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
13e70 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
13e80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
13e90 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
13ea0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
13eb0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
13ec0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
13ed0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
13ee0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
13ef0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
13f00 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
13f10 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
13f20 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
13f30 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
13f40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13f50 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13f60 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
13f70 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
13f80 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
13f90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
13fa0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
13fb0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
13fc0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
13fd0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
13fe0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
13ff0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
14000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14010 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14020 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
14030 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14040 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
14050 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14060 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14070 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14080 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
14090 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
140a0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
140b0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
140c0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
140d0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
140e0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
140f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14100 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14110 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14120 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14130 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14140 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14150 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14160 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14170 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14180 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14190 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
141a0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
141b0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
141c0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
141d0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
141e0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
141f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14200 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14210 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14220 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14230 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14240 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14250 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14260 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14270 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14280 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14290 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
142a0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
142b0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
142c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
142d0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
142e0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
142f0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14300 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
14310 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
14320 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
14330 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
14340 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14350 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14360 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14370 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14380 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14390 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
143a0 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
143b0 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
143c0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
143d0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
143e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
143f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14400 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14410 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14420 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14430 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14440 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14450 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14460 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14480 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14490 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
144a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
144b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
144c0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
144d0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
144e0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
144f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14500 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14510 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14520 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14530 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
14540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14550 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14560 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14570 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14580 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
14590 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
145a0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
145b0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
145c0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
145d0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
145e0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
145f0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
14600 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
14610 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
14620 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
14630 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
14640 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
14650 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14660 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14670 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
14680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14690 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
146a0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
146b0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
146c0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
146d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
146e0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
146f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14700 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
14710 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
14720 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14730 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
14760 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
14770 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
14780 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
14790 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
147a0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
147b0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
147c0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
147d0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
147e0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
147f0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
14800 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
14810 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
14820 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
14830 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14840 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
14850 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
14860 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
14870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14880 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
14890 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
148a0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
148b0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
148c0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
148d0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
148e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
148f0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
14900 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
14910 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
14920 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14930 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14940 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14950 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14960 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14970 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
14980 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
14990 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
149a0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
149b0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
149c0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
149d0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
149e0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
149f0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
14a00 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14a20 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
14a30 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14a40 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14a50 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
14a60 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
14a70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
14a80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
14a90 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
14aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14ab0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14ac0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
14ad0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
14ae0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14af0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
14b00 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
14b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14b20 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
14b30 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
14b40 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
14b50 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14b60 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
14b70 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
14b80 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
14b90 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
14ba0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14bb0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
14bc0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
14bd0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
14be0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
14bf0 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
14c00 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
14c10 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
14c20 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
14c30 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
14c40 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
14c50 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
14c60 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14c70 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14c80 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
14c90 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
14ca0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
14cb0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
14cc0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
14cd0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
14ce0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
14cf0 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
14d00 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
14d10 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
14d20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
14d30 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
14d40 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
14d50 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
14d60 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
14d70 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
14d80 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
14d90 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
14da0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
14db0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
14dc0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
14dd0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
14de0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
14df0 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
14e00 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
14e10 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
14e20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
14e30 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
14e40 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
14e50 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
14e60 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
14e70 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
14e80 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
14e90 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
14ea0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
14eb0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
14ec0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
14ed0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
14ee0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
14ef0 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
14f00 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
14f10 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
14f20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
14f30 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
14f40 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
14f50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
14f60 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
14f70 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
14f80 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
14f90 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
14fa0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
14fb0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
14fc0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
14fd0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
14fe0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
14ff0 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
15000 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
15010 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
15020 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
15030 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
15040 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
15050 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
15060 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
15070 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15080 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
15090 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
150a0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
150b0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
150c0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
150d0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
150e0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
150f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
15100 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
15110 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
15120 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
15130 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
15140 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15150 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
15160 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
15170 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
15180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15190 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
151a0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
151b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
151c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
151d0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
151e0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
151f0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
15200 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
15210 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15220 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15230 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15240 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
15250 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15260 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
15270 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
15280 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
15290 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
152a0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
152b0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
152c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
152d0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
152e0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
152f0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
15300 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
15310 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
15320 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
15330 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
15340 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
15350 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
15360 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
15370 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
15380 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
15390 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
153a0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
153b0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
153c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
153d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
153e0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
153f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
15400 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
15410 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
15420 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
15430 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
15440 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
15450 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
15460 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
15470 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
15480 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
15490 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
154a0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
154b0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
154c0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
154d0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
154e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
154f0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
15500 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
15510 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
15520 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
15530 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
15540 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
15550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
15560 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
15570 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
15580 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
15590 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
155a0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
155b0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
155c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
155d0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
155e0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
155f0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
15600 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
15610 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15620 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15630 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
15640 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
15650 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
15660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15670 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
15680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15690 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
156a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
156b0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
156c0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
156d0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
156e0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
156f0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
15700 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
15710 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
15720 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
15730 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
15740 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
15750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15770 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
15780 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
15790 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
157a0 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
157b0 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
157c0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
157d0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
157e0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
157f0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
15800 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
15810 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
15820 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
15830 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
15840 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
15850 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
15860 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
15870 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
15880 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
15890 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
158a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
158b0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
158c0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
158d0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
158e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
158f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15900 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15910 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15920 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15930 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15940 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
15950 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15960 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15970 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
159a0 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
159b0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
159c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
159d0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
159e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
159f0 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
15a00 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
15a10 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
15a20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
15a30 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
15a40 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
15a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
15a60 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
15a70 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
15a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
15a90 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
15aa0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
15ab0 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
15ac0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
15ad0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
15ae0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
15af0 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
15b00 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
15b10 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
15b20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
15b30 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
15b40 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
15b50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15b60 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
15b70 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15b80 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15b90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15ba0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
15bb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15bc0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15bd0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15be0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15bf0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
15c00 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
15c10 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15c20 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15c30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15c40 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
15c50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
15c60 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15c70 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15c80 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15ca0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15cb0 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15cd0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15ce0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15cf0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15d00 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15d10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
15d20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15d30 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15d40 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15d50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15d60 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15d70 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15d80 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15da0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15dc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15dd0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15de0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15df0 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15e00 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
15e10 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
15e20 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
15e30 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
15e40 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
15e50 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
15e60 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15e70 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15e80 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15e90 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15ea0 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15eb0 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15ec0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15ed0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15ee0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15ef0 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15f00 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15f10 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15f20 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15f30 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15f40 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15f50 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15f60 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15f70 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15f80 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15f90 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15fa0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15fb0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15fc0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15fd0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15fe0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16000 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
16010 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
16020 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
16030 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
16040 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
16050 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
16060 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16070 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16080 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16090 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
160a0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
160b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
160c0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
160d0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
160e0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
160f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16100 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16120 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  dif../*.** Chang
16130 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
16140 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
16150 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16160 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
16170 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
16180 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
16190 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
161a0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
161b0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
161c0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
161d0 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
161e0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
161f0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
16200 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
16210 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
16220 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
16230 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
16240 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
16250 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
16260 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
16270 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
16280 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
16290 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
162a0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
162b0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
162c0 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
162d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
162e0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
162f0 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
16300 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
16310 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
16320 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
16330 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
16340 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
16350 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
16360 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
16370 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16380 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
16390 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
163a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
163b0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
163c0 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
163d0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
163e0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
163f0 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
16400 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
16410 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
16420 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
16430 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
16440 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
16450 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
16460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16470 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
16480 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
16490 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
164a0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
164b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
164c0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
164d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
164e0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
164f0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
16500 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
16510 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16520 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
16530 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
16540 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
16550 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
16560 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16570 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
16580 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
16590 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
165a0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
165b0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
165c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
165d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
165e0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
165f0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
16600 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
16610 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16620 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
16630 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
16640 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
16650 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16660 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
16670 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
16680 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
16690 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
166a0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
166b0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
166c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
166d0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
166e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
166f0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
16700 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
16710 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
16720 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
16730 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
16740 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16750 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
16760 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
16770 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
16780 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
16790 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
167a0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
167b0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
167c0 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
167d0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
167e0 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
167f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16810 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16820 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
16830 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
16840 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16850 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
16860 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
16870 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
16880 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
16890 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
168a0 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
168b0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
168c0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
168d0 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
168e0 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
168f0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
16900 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
16910 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
16920 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
16930 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
16940 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
16950 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
16960 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
16970 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
16980 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
16990 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
169a0 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
169b0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
169c0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
169d0 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
169e0 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
169f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16a00 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
16a10 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
16a20 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
16a30 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
16a40 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
16a50 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
16a60 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
16a70 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
16a80 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
16a90 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
16aa0 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
16ab0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
16ac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16ad0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16ae0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16af0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
16b00 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
16b10 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
16b20 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
16b30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16b40 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
16b50 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
16b60 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
16b70 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
16b80 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
16b90 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
16ba0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
16bb0 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
16bc0 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
16bd0 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
16be0 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
16bf0 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
16c00 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
16c10 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
16c20 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
16c30 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
16c40 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
16c50 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
16c60 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
16c70 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
16c80 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
16c90 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
16ca0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
16cb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16cc0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
16cd0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16ce0 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
16cf0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16d00 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
16d10 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16d20 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
16d30 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16d40 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
16d50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16d60 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16d70 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
16d80 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
16d90 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
16da0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
16db0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
16dc0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
16dd0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
16de0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
16df0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
16e00 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
16e10 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
16e20 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
16e30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16e40 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
16e50 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16e60 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
16e70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16e80 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16e90 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
16ea0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
16eb0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16ec0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16ed0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16ee0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
16ef0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
16f00 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
16f10 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
16f20 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
16f30 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
16f40 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
16f50 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
16f60 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
16f70 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
16f80 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
16f90 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
16fa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16fb0 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
16fc0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
16fd0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
16fe0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
16ff0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
17000 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
17010 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
17020 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
17030 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
17040 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
17050 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
17060 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17070 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
17080 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
17090 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
170a0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
170b0 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
170c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
170d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
170e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
170f0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
17100 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
17110 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
17120 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
17130 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17140 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
17150 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
17160 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
17170 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
17180 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
17190 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
171a0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
171b0 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
171c0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
171d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
171e0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
171f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17200 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
17210 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
17220 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
17230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17240 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17250 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17260 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
17270 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17280 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
17290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
172a0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
172b0 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
172c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
172d0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
172e0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
172f0 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
17300 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
17310 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
17320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
17330 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
17340 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
17350 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
17360 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
17370 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
17380 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17390 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
173a0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
173b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
173c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
173d0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
173e0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
173f0 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
17400 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
17410 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17420 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
17430 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
17440 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17460 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17470 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
17480 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
17490 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
174a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
174b0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
174c0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
174d0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
174e0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
174f0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
17500 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
17510 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
17520 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
17530 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
17540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17550 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17560 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
17570 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
17580 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
17590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
175a0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
175b0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
175c0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
175d0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
175e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
175f0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
17600 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
17610 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
17620 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
17630 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
17640 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
17650 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
17660 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
17670 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
17680 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
17690 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
176a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
176b0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
176c0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
176d0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
176e0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
176f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17700 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
17710 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
17720 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
17730 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
17740 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
17750 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17760 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
17770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17780 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17790 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
177a0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
177b0 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
177c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
177d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
177e0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
177f0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
17800 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17810 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
17820 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
17830 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17840 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
17850 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
17860 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
17870 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
17880 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
17890 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
178a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
178b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
178c0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
178d0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
178e0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
178f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17900 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
17910 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
17920 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
17930 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
17940 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
17950 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
17960 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
17970 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
17980 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
17990 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
179a0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
179b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
179c0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
179d0 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
179e0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
179f0 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
17a00 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
17a10 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17a20 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
17a30 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
17a40 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
17a50 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
17a60 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
17a70 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
17a80 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
17a90 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
17aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
17ab0 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
17ac0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
17ad0 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
17ae0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
17af0 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
17b00 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
17b10 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
17b20 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
17b30 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
17b40 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
17b50 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
17b60 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
17b70 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
17b80 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
17b90 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
17ba0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17bb0 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
17bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
17bd0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17be0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
17bf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17c00 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
17c10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
17c20 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
17c30 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17c40 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
17c50 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
17c60 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
17c70 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17c80 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
17c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17ca0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
17cb0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17cc0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17ce0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
17cf0 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
17d00 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
17d10 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
17d20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
17d30 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
17d40 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
17d50 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
17d60 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
17d70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
17d80 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
17d90 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
17da0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
17db0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
17dc0 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
17dd0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
17de0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
17df0 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
17e00 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
17e10 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
17e20 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
17e30 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
17e40 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
17e50 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
17e60 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
17e70 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
17e80 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
17e90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17ea0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
17eb0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
17ec0 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
17ed0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
17ee0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
17ef0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17f00 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
17f10 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
17f20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17f40 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17f50 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
17f60 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49 54  }else{.#if SQLIT
17f70 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
17f80 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
17f90 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
17fa0 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20 73 71  ONOUS.        sq
17fb0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20  lite3 *db;.     
17fc0 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
17fd0 20 20 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d      if( (db=pBt-
17fe0 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d  >db)!=0 && (pDb=
17ff0 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20  db->aDb)!=0 ){. 
18000 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
18010 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
18020 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
18030 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
18040 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
18050 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20 20 20  >bSyncSet==0.   
18060 20 20 20 20 20 20 20 20 26 26 20 70 44 62 2d 3e          && pDb->
18070 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 53 51  safety_level==SQ
18080 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
18090 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20 20 20  CHRONOUS+1.     
180a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
180b0 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
180c0 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
180d0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
180e0 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20 20 20  RONOUS+1;.      
180f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18100 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
18110 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18120 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65         pDb->safe
18130 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e  ty_level | (db->
18140 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 4c  flags & PAGER_FL
18150 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20  AGS_MASK));.    
18160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18170 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
18180 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
18190 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
181a0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
181b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
181c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
181d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
181e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
181f0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
18200 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
18210 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
18220 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
18230 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
18240 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
18250 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
18260 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
18270 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
18280 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
18290 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
182a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
182b0 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
182c0 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
182d0 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
182e0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
182f0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
18300 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
18310 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
18320 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
18330 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
18340 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
18350 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
18360 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18370 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18380 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18390 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
183a0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
183b0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
183c0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
183d0 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
183e0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
183f0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
18400 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
18410 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
18420 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
18430 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
18440 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
18450 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
18460 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
18470 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18480 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
18490 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
184a0 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
184b0 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
184c0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
184d0 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
184e0 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
184f0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
18500 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
18510 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
18520 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
18530 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
18540 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
18550 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18560 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18570 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
18580 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
18590 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
185a0 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
185b0 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
185c0 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
185d0 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
185e0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
185f0 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
18600 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
18610 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
18620 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
18630 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
18640 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
18650 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
18660 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
18670 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
18680 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
18690 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
186a0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
186b0 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
186c0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
186d0 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
186e0 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
186f0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18700 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
18710 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
18720 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
18730 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
18740 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
18750 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
18760 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
18770 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
18780 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
18790 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
187a0 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
187b0 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
187c0 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
187d0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
187e0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
187f0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
18800 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
18810 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
18820 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
18830 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
18840 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
18850 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
18860 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
18870 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
18880 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
18890 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
188a0 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
188b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
188c0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
188d0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
188e0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
188f0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
18900 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
18910 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
18920 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
18930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18940 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
18950 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
18960 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
189a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
189b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
189c0 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
189d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
189e0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
189f0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
18a00 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
18a10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18a20 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
18a30 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18a40 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
18a50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
18a60 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
18a70 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
18a80 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
18a90 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
18aa0 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
18ab0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
18ac0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
18ad0 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
18ae0 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
18af0 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
18b00 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
18b10 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
18b20 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
18b30 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18b40 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
18b50 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
18b60 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
18b70 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18b80 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
18b90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18ba0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18bb0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
18bc0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
18bd0 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
18be0 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
18bf0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
18c00 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
18c10 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
18c20 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
18c30 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
18c40 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
18c50 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
18c60 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
18c70 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
18c80 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
18c90 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
18ca0 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
18cb0 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
18cc0 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
18cd0 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
18ce0 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
18cf0 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
18d00 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
18d10 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
18d20 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
18d30 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
18d40 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
18d50 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
18d60 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
18d70 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
18d80 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
18d90 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
18da0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
18db0 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
18dc0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
18dd0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
18de0 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
18df0 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
18e00 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
18e10 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
18e20 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
18e30 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
18e40 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
18e50 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
18e60 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
18e70 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
18e80 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
18e90 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18ea0 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
18eb0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
18ec0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
18ed0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18ee0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
18ef0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
18f00 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
18f10 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
18f20 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
18f30 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
18f40 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
18f50 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
18f60 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
18f70 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
18f80 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
18f90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
18fa0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
18fb0 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
18fc0 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
18fd0 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
18fe0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
18ff0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
19000 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
19010 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
19020 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
19030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19040 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
19050 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
19060 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
19070 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
19080 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19090 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
190a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
190b0 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
190c0 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
190d0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
190e0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
190f0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
19100 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
19110 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
19120 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
19130 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
19140 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
19150 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
19160 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
19170 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
19180 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
19190 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
191a0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
191b0 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
191c0 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
191d0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
191e0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
191f0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
19200 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
19210 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
19220 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
19230 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
19240 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
19250 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
19260 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
19270 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
19280 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
19290 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
192a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
192b0 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
192c0 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
192d0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
192e0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
192f0 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
19300 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
19310 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
19320 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
19330 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
19340 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
19350 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
19360 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
19370 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
19380 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
19390 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
193a0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
193b0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
193c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
193d0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
193e0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
193f0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
19400 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
19410 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
19420 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
19430 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
19440 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
19450 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
19460 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
19470 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
19480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
19490 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
194a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
194b0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
194c0 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
194d0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
194e0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
194f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19500 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
19510 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
19520 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
19530 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
19540 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
19550 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
19560 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19570 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
19580 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
19590 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
195a0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
195b0 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
195c0 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
195d0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
195e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
195f0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
19600 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
19610 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
19620 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
19630 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20  tNull(pPage1);. 
19640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
19650 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
19660 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
19670 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
19680 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
19690 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
196a0 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
196b0 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
196c0 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
196d0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
196e0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
196f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
19700 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
19710 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
19720 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
19730 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
19740 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19750 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19760 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
19770 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
19780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19790 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
197a0 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
197b0 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
197c0 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
197d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
197e0 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
197f0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
19800 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
19810 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
19820 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
19830 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
19840 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19850 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
19860 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
19870 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
19880 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
19890 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
198a0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
198b0 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
198c0 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
198d0 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
198e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
198f0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
19900 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
19910 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
19920 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
19930 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
19940 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
19950 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
19960 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
19970 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
19980 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
19990 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
199a0 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
199b0 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
199c0 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
199d0 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
199e0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
199f0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
19a00 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
19a10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19a20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19a30 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19a40 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
19a50 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19a60 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
19a70 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
19a80 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
19a90 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
19aa0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
19ab0 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
19ac0 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
19ad0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
19ae0 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
19af0 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
19b00 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
19b10 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
19b20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19b30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
19b40 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
19b50 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
19b60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
19b70 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
19b80 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
19b90 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
19ba0 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
19bb0 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
19bc0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
19bd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
19be0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
19bf0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
19c00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19c10 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
19c20 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
19c30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19c40 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
19c50 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
19c60 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
19c70 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
19c80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19ca0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
19cb0 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
19cc0 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
19cd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
19ce0 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
19cf0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19d00 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
19d10 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
19d20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
19d30 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
19d40 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
19d50 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
19d60 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
19d70 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
19d80 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
19d90 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
19da0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
19db0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
19dc0 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
19dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
19de0 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
19df0 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
19e00 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
19e10 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
19e20 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
19e30 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
19e40 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
19e50 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
19e60 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
19e70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
19e80 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
19e90 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
19ea0 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
19eb0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19ec0 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
19ed0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
19ee0 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
19ef0 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
19f00 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
19f10 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
19f20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
19f30 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
19f40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
19f50 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
19f60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19f70 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
19f80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19f90 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
19fa0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19fb0 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
19fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
19fd0 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
19fe0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
19ff0 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
1a000 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
1a010 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
1a020 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
1a030 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
1a040 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
1a050 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
1a060 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
1a070 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
1a080 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a090 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
1a0a0 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
1a0b0 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
1a0c0 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
1a0d0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
1a0e0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a0f0 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
1a100 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
1a110 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
1a120 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
1a130 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1a140 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
1a150 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
1a160 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
1a170 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
1a180 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
1a190 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
1a1a0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
1a1b0 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
1a1c0 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
1a1d0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1a1e0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
1a1f0 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
1a200 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
1a210 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
1a220 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
1a230 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
1a240 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
1a250 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
1a260 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
1a270 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
1a280 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
1a290 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
1a2a0 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
1a2b0 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
1a2c0 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
1a2d0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1a2e0 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
1a2f0 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
1a300 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
1a310 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
1a320 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
1a330 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1a340 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1a350 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
1a360 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
1a370 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a380 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1a390 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
1a3a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a3b0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1a3c0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1a3d0 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
1a3e0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
1a3f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
1a400 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
1a410 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
1a420 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
1a430 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
1a440 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
1a450 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
1a460 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1a470 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1a480 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
1a490 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
1a4a0 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
1a4b0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1a4c0 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
1a4d0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1a4e0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1a4f0 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
1a500 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
1a510 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
1a520 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
1a530 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
1a540 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
1a550 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1a560 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
1a570 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1a580 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
1a590 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
1a5a0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1a5b0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1a5c0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
1a5d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a5e0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b  SHARED_CACHE.  {
1a5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42  .    sqlite3 *pB
1a600 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  lock = 0;.    /*
1a610 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1a620 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1a630 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1a640 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1a650 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  on .    ** on th
1a660 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
1a670 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
1a680 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
1a690 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  nsaction is.    
1a6a0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1a6b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1a6c0 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ED..    */.    i
1a6d0 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
1a6e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a6f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
1a700 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73      || (pBt->bts
1a710 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
1a720 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ING)!=0.    ){. 
1a730 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42       pBlock = pB
1a740 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1a750 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
1a760 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  flag>1 ){.      
1a770 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
1a780 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70       for(pIter=p
1a790 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1a7a0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1a7b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
1a7c0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
1a7d0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=p ){.         
1a7e0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
1a7f0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
1a800 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a820 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1a830 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  lock ){.      sq
1a840 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1a850 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1a860 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1a870 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
1a880 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
1a890 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1a8a0 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  gun;.    }.  }.#
1a8b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1a8c0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1a8d0 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1a8e0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1a8f0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1a900 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1a910 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1a920 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1a930 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1a940 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1a950 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1a960 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1a970 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1a980 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1a990 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1a9a0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1a9b0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1a9c0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1a9d0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a9e0 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1a9f0 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1aa00 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1aa10 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1aa20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1aa30 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1aa40 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1aa50 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1aa60 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1aa70 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1aa80 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1aa90 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1aaa0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1aab0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1aac0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1aad0 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1aae0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1aaf0 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1ab00 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1ab10 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1ab20 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1ab30 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1ab40 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1ab50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ab60 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1ab70 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1ab80 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1ab90 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1aba0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1abb0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1abc0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1abd0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1abe0 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1abf0 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1ac00 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1ac10 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1ac20 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1ac30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ac40 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1ac50 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1ac60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1ac70 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1ac80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ac90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1aca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1acb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1acc0 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
1acd0 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
1ace0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
1acf0 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
1ad00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ad10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ad20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1ad30 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1ad40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ad50 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
1ad60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ad70 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1ad80 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1ad90 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
1ada0 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
1adb0 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
1adc0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1add0 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
1ade0 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
1adf0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
1ae00 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1ae10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1ae20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1ae30 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1ae40 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1ae50 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
1ae60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1ae70 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
1ae80 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
1ae90 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1aea0 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
1aeb0 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
1aec0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1aed0 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
1aee0 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
1aef0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
1af00 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
1af10 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
1af20 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
1af30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1af40 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
1af50 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
1af60 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
1af70 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
1af80 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
1af90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1afa0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
1afb0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
1afc0 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
1afd0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1afe0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1aff0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1b000 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
1b010 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1b020 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
1b030 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
1b040 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
1b050 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
1b060 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1b070 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
1b080 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
1b090 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
1b0a0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
1b0b0 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
1b0c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1b0d0 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
1b0e0 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
1b0f0 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
1b100 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
1b110 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
1b120 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
1b130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
1b140 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
1b150 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
1b160 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
1b170 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
1b180 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1b190 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
1b1a0 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
1b1b0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1b1c0 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
1b1d0 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
1b1e0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
1b1f0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
1b200 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1b210 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1b220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b230 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
1b240 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1b250 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
1b260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b270 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1b280 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1b290 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b2a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b2b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1b2c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1b2d0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1b2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b2f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
1b300 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
1b310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b320 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1b330 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1b340 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1b350 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1b360 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1b370 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1b380 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1b390 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1b3a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b3b0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1b3c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1b3d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1b3e0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1b3f0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1b400 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1b410 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1b420 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1b430 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
1b440 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
1b450 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1b460 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1b470 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1b480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1b490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b4a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1b4b0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
1b4c0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
1b4d0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
1b4e0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
1b4f0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
1b500 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
1b510 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1b520 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
1b530 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
1b540 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1b550 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1b560 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
1b570 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
1b580 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
1b590 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
1b5a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
1b5d0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
1b5e0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b600 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
1b610 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
1b620 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1b650 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
1b660 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1b670 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
1b680 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
1b690 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
1b6a0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1b6b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b6c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b6d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1b6e0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
1b6f0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1b700 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1b720 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
1b730 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
1b740 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1b750 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
1b760 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1b770 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1b780 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1b790 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
1b7a0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
1b7b0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1b7c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1b7d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1b7e0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1b7f0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1b800 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1b810 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1b820 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1b830 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1b840 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1b850 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1b860 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1b870 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1b880 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1b890 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1b8a0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1b8b0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1b8c0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1b8d0 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
1b8e0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
1b8f0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1b900 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
1b910 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b920 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
1b930 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
1b940 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
1b950 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
1b960 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
1b970 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1b980 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
1b990 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
1b9a0 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
1b9b0 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
1b9c0 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
1b9d0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
1b9e0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
1b9f0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1ba00 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1ba10 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
1ba20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1ba30 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
1ba40 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1ba50 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
1ba60 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1ba70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1ba80 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
1ba90 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1bab0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
1bac0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
1bad0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
1bae0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1baf0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
1bb00 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
1bb10 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1bb20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1bb50 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
1bb60 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
1bb70 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
1bb80 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
1bb90 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
1bba0 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
1bbb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1bbc0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1bbd0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1bbe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bbf0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1bc00 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1bc10 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
1bc20 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1bc30 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
1bc40 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
1bc50 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
1bc60 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
1bc70 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1bc80 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
1bc90 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1bca0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1bcb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bcc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1bcd0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1bce0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1bcf0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1bd00 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
1bd10 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
1bd20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bd30 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  int nCell;.    i
1bd40 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d  nt rc;..    rc =
1bd50 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1bd60 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1bd70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1bd80 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
1bd90 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
1bda0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1bdb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
1bdc0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1bdd0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1bde0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1bdf0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
1be00 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
1be10 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
1be20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
1be30 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
1be40 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
1be50 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
1be60 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 0a 20 20  info.nPayload.  
1be70 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
1be80 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50  info.nSize-1<=pP
1be90 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
1bea0 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20  ->maskPage.     
1beb0 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65      && iFrom==ge
1bec0 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1bed0 6f 2e 6e 53 69 7a 65 2d 34 29 0a 20 20 20 20 20  o.nSize-4).     
1bee0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1bef0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  put4byte(pCell+i
1bf00 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f  nfo.nSize-4, iTo
1bf10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1bf20 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1bf30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bf40 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1bf50 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
1bf60 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1bf70 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
1bf80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1bf90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bfa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1bfb0 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
1bfc0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1bfd0 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
1bfe0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
1bff0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c000 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c010 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
1c020 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1c030 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1c040 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
1c050 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c060 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1c070 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1c080 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
1c090 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1c0a0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
1c0b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1c0c0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1c0d0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1c0e0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1c0f0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1c100 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1c110 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1c120 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1c130 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1c140 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1c150 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1c160 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1c170 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1c180 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1c190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1c1a0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1c1b0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1c1c0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1c1d0 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1c1e0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1c1f0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1c200 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1c210 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1c220 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1c230 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1c240 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1c250 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1c260 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1c270 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1c280 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1c290 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1c2a0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1c2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1c2c0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1c2d0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c2e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1c2f0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1c300 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1c310 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1c320 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1c330 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1c340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c350 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1c360 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1c370 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1c380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1c390 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1c3a0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1c3b0 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1c3c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1c3d0 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1c3e0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1c3f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1c400 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c410 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1c420 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1c430 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1c440 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1c450 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1c460 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1c470 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1c480 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1c490 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1c4a0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1c4b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1c4c0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1c4d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1c4e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1c4f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1c500 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1c510 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1c520 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1c530 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1c540 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1c550 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1c560 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1c570 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1c580 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1c590 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1c5a0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1c5b0 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1c5c0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1c5d0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1c5e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1c5f0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1c600 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1c610 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1c620 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1c630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c650 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1c660 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1c670 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1c680 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1c690 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1c6a0 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1c6b0 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1c6c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1c6d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1c6e0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1c6f0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1c700 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1c710 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1c720 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1c730 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1c740 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1c750 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1c760 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1c770 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1c780 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1c790 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1c7a0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1c7b0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1c7c0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1c7d0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1c7e0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1c7f0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1c800 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1c810 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1c820 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c830 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1c840 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1c850 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1c860 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c880 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1c8a0 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1c8b0 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1c8c0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1c8d0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1c8e0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1c8f0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1c900 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1c910 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1c920 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1c930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c940 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c960 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1c970 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1c980 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1c990 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1c9a0 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1c9b0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1c9c0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1c9d0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1c9e0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1c9f0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1ca00 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1ca10 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1ca20 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1ca30 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1ca40 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1ca50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1ca60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ca70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1ca80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1ca90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1caa0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1cab0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1cac0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cad0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1cae0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1caf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1cb00 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1cb10 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1cb20 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1cb30 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1cb40 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1cb50 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1cb60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cb70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cb80 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1cb90 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1cba0 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1cbb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cbc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1cbd0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1cbe0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1cbf0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1cc00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1cc10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1cc20 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1cc30 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1cc40 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1cc50 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1cc60 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1cc70 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1cc80 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1cc90 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1cca0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1ccb0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1ccc0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1ccd0 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1cce0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1ccf0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1cd00 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1cd10 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1cd20 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1cd30 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1cd40 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1cd50 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1cd60 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1cd70 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1cd80 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1cd90 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1cda0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1cdb0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1cdc0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1cdd0 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1cde0 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1cdf0 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1ce00 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1ce10 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1ce20 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1ce30 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1ce40 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1ce50 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1ce60 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1ce70 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1ce80 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1ce90 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1cea0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1ceb0 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1cec0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1ced0 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1cee0 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1cef0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1cf00 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1cf10 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1cf20 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1cf30 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1cf40 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1cf50 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1cf60 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1cf70 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1cf80 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1cf90 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1cfa0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1cfb0 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1cfc0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1cfd0 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1cfe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cff0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1d000 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1d010 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1d020 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d030 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1d040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d050 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1d060 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1d070 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d080 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1d090 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1d0a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1d0b0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1d0c0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1d0d0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1d0e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1d0f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1d100 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1d110 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1d120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d130 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1d140 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1d150 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1d160 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1d170 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d1a0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1d1b0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1d1c0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1d1d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d1e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1d1f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d200 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1d210 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1d220 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1d230 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1d240 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1d250 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1d260 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1d270 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1d280 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1d290 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1d2a0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1d2b0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1d2c0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1d2d0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1d2e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1d2f0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1d300 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1d310 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1d320 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1d330 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1d340 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d350 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1d360 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1d370 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1d380 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1d390 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1d3a0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1d3b0 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1d3c0 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1d3d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d3e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1d410 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1d420 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1d430 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d440 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d450 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1d460 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1d470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d480 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1d490 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1d4a0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1d4b0 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1d4c0 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1d4d0 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1d4e0 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1d4f0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1d500 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1d510 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1d520 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1d530 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1d540 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1d550 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1d560 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1d570 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1d580 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1d590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d5c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d5d0 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1d5e0 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1d5f0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1d600 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1d610 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1d620 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1d630 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1d640 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1d650 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1d660 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1d670 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1d680 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1d690 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1d6a0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1d6b0 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1d6c0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1d6d0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1d6e0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1d6f0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1d700 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1d710 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d720 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1d730 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1d740 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1d750 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1d760 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1d770 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1d780 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d790 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d7a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d7b0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d7c0 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1d7d0 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1d7e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d7f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d800 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1d810 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1d820 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d830 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1d840 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1d850 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1d860 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1d870 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1d880 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1d890 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1d8a0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1d8b0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1d8c0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1d8d0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1d8e0 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1d8f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d900 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1d910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d920 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d930 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1d940 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d950 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1d960 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1d970 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1d980 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1d990 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d9a0 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1d9b0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1d9c0 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1d9d0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1d9e0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1d9f0 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1da00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1da10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1da20 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1da30 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1da40 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1da50 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1da60 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1da70 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1da80 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1da90 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1daa0 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1dab0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1dac0 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1dad0 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1dae0 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1daf0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1db00 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1db10 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1db20 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1db30 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1db60 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1db70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1db80 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1dbb0 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1dbc0 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1dbd0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1dbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dbf0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1dc00 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1dc10 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1dc20 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1dc30 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1dc40 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1dc50 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1dc60 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1dc70 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1dc80 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1dc90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1dca0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1dcb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1dcc0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1dcd0 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1dce0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1dcf0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1dd00 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1dd10 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1dd20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1dd30 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1dd40 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1dd50 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1dd60 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1dd70 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1dd80 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1dd90 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1dda0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1ddb0 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1ddc0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1ddd0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1dde0 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1ddf0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1de00 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1de10 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1de20 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1de30 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1de40 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1de50 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1de60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1de70 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1de80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1de90 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1dea0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1deb0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1dec0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1ded0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1dee0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1def0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1df00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1df10 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1df20 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1df30 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1df40 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1df50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1df60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1df70 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1df80 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1df90 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1dfa0 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1dfb0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1dfc0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1dfd0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1dfe0 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1dff0 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1e000 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1e010 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1e020 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e030 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1e050 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1e060 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1e070 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1e080 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e090 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e0a0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1e0b0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1e0c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1e0d0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1e0e0 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1e0f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1e100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e120 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e130 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1e140 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e150 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e160 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e170 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1e180 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1e190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1e1a0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1e1b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1e1c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1e1d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e1e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e1f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1e200 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1e210 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1e220 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1e230 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1e240 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1e250 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1e260 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1e270 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1e280 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1e290 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1e2a0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1e2b0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1e2c0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1e2d0 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1e2e0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1e2f0 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1e300 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1e310 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1e320 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1e330 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1e340 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1e350 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1e360 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1e370 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1e380 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e390 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1e3a0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1e3b0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1e3c0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1e3d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1e3e0 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1e3f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e400 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1e410 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1e420 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1e430 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1e440 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1e450 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1e460 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1e470 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1e480 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e490 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1e4a0 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1e4b0 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1e4c0 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1e4d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1e4e0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1e4f0 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1e500 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1e510 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1e520 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1e530 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1e540 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1e550 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1e560 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1e570 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1e580 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1e590 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1e5a0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e5b0 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1e5c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1e5d0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1e5e0 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1e5f0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1e600 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1e610 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1e620 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1e630 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1e640 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1e650 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1e660 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1e670 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1e680 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1e690 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1e6a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1e6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e6c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1e6d0 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1e6e0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e6f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1e700 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1e710 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1e720 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1e730 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1e740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e750 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e760 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1e770 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1e780 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1e790 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1e7a0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1e7b0 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1e7c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1e7d0 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1e7e0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1e7f0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1e800 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1e810 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1e820 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1e830 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1e840 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1e850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e860 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1e870 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e880 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e890 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e8a0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1e8b0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e8c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e8d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1e8e0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e8f0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1e900 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1e910 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1e920 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1e930 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1e940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1e960 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1e970 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1e980 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1e990 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1e9a0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1e9b0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1e9c0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1e9d0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1e9e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1e9f0 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1ea00 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1ea10 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1ea20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ea30 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1ea40 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1ea50 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1ea60 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1ea70 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1ea80 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1ea90 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1eaa0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1eab0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1eac0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1ead0 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1eae0 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1eaf0 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1eb00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1eb10 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1eb20 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1eb30 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1eb40 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1eb50 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1eb60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1eb70 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1eb80 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1eb90 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1eba0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1ebb0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1ebc0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1ebd0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1ebe0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ebf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ec00 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1ec10 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1ec20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1ec30 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1ec40 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1ec50 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1ec60 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1ec70 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1ec80 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1ec90 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1eca0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1ecb0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1ecc0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1ecd0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1ece0 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1ecf0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1ed00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1ed10 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1ed20 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1ed30 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1ed40 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1ed50 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1ed60 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1ed70 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1ed80 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1ed90 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1eda0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1edb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1edc0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1edd0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ede0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1edf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1ee00 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1ee10 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1ee20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1ee30 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1ee40 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1ee50 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1ee60 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1ee70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1ee80 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1ee90 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
1eea0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
1eeb0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
1eec0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
1eed0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1eee0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
1eef0 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
1ef00 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
1ef10 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
1ef20 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
1ef30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
1ef40 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
1ef50 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
1ef60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1ef70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ef80 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1ef90 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
1efa0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1efb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1efc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
1efd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1efe0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1eff0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f000 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1f010 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
1f020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f030 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1f040 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1f050 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
1f060 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
1f070 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
1f080 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f090 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
1f0a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1f0b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f0c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f0d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1f0e0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
1f0f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f100 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1f110 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
1f120 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
1f130 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1f140 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1f150 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
1f160 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
1f170 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1f180 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f190 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f1a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1f1b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f1c0 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
1f1d0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1f1e0 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
1f1f0 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
1f200 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
1f210 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
1f220 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
1f230 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
1f240 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
1f250 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f260 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
1f270 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
1f280 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1f290 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1f2a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f2b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f2c0 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
1f2d0 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
1f2e0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1f2f0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1f300 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
1f310 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1f320 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
1f330 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
1f340 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
1f350 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
1f360 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
1f370 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
1f380 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
1f390 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
1f3a0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
1f3b0 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
1f3c0 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1f3d0 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
1f3e0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
1f3f0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1f400 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
1f410 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
1f420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f430 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1f440 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
1f450 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1f460 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
1f470 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1f480 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
1f490 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
1f4a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f4b0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
1f4c0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
1f4d0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1f4e0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
1f4f0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1f500 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
1f510 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
1f520 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
1f530 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
1f540 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
1f550 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
1f560 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
1f570 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1f580 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1f590 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
1f5a0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
1f5b0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1f5c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1f5d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
1f5e0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1f5f0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1f600 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1f610 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
1f620 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
1f630 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
1f640 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
1f650 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
1f660 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
1f670 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
1f680 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
1f690 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
1f6a0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1f6b0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1f6c0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1f6d0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
1f6e0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
1f6f0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
1f700 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
1f710 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f720 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
1f730 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1f740 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
1f750 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
1f760 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1f770 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
1f780 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
1f790 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
1f7a0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
1f7b0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
1f7c0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
1f7d0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1f7e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
1f7f0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
1f800 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
1f810 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
1f820 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
1f830 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
1f840 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
1f850 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
1f860 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
1f870 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
1f880 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
1f890 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
1f8a0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
1f8b0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
1f8c0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
1f8d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1f8e0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
1f8f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f900 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
1f910 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
1f920 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
1f930 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1f940 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
1f950 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
1f960 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
1f970 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
1f980 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
1f990 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f9a0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
1f9b0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
1f9c0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
1f9d0 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
1f9e0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
1f9f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1fa00 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
1fa10 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
1fa20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1fa30 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
1fa40 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
1fa50 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
1fa60 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
1fa70 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1fa80 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
1fa90 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
1faa0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1fab0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
1fac0 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
1fad0 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
1fae0 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
1faf0 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
1fb00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
1fb10 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1fb20 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
1fb30 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
1fb40 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
1fb50 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1fb60 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
1fb70 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
1fb80 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
1fb90 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
1fba0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
1fbb0 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
1fbc0 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
1fbd0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
1fbe0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1fbf0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1fc00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fc10 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1fc20 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1fc30 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1fc40 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1fc50 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1fc60 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1fc70 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
1fc80 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
1fc90 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
1fca0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1fcb0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1fcc0 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
1fcd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1fce0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1fcf0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
1fd00 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
1fd10 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
1fd20 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
1fd30 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
1fd40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
1fd50 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
1fd60 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1fd70 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
1fd80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1fd90 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1fda0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
1fdb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1fdc0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1fdd0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1fde0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1fdf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fe00 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1fe10 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
1fe20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1fe30 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
1fe40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1fe50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1fe60 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
1fe70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1fe80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1fe90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fea0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
1feb0 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
1fec0 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
1fed0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
1fee0 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
1fef0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1ff00 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1ff10 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1ff20 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1ff30 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1ff40 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1ff50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ff60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
1ff70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ff80 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
1ff90 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
1ffa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ffb0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
1ffc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1ffd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ffe0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
1fff0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20000 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
20010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20020 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20030 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20040 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
20050 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
20060 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20080 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
20090 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
200a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
200b0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
200c0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
200d0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
200e0 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
200f0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
20100 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
20110 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
20120 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
20130 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
20140 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
20150 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
20160 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
20170 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
20180 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
20190 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
201a0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
201b0 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
201c0 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
201d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
201e0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
201f0 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
20200 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
20210 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
20220 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
20230 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
20240 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
20250 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
20260 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
20270 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
20280 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
20290 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
202a0 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
202b0 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
202c0 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
202d0 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
202e0 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
202f0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
20300 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
20310 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
20320 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
20330 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
20340 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
20350 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
20360 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
20370 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
20380 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
20390 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
203a0 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
203b0 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
203c0 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
203d0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
203e0 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
203f0 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
20400 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
20410 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
20420 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
20430 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20440 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
20450 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
20460 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
20470 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
20480 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
20490 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
204a0 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
204b0 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
204c0 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
204d0 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
204e0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
204f0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
20500 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
20510 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20520 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
20530 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
20540 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
20550 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
20560 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20570 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
20580 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
20590 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
205a0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
205b0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
205c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
205d0 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
205e0 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
205f0 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
20600 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
20610 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
20620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20630 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
20640 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
20650 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
20660 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
20670 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
20680 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
20690 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
206a0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
206b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
206c0 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
206d0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
206e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
206f0 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
20700 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
20710 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
20720 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
20730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20740 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
20750 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
20760 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
20770 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
20780 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
207a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
207b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
207c0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
207d0 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
207e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
207f0 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
20800 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
20810 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
20820 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20830 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
20840 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
20850 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
20860 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  i]);.        p->
20870 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
20880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
208a0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
208b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
208c0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
208d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
208e0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
208f0 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
20900 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
20910 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
20920 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
20930 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
20940 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
20950 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
20960 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
20970 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
20980 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
20990 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
209a0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
209b0 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
209c0 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
209d0 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
209e0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
209f0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
20a00 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
20a10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20a20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
20a30 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
20a40 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
20a50 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
20a60 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
20a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
20a80 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
20a90 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
20aa0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
20ab0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
20ac0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20ad0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
20ae0 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
20af0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
20b00 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
20b10 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
20b20 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
20b30 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
20b40 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
20b50 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
20b60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
20b70 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
20b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
20b90 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
20ba0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20bb0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
20bc0 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
20bd0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
20be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20bf0 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
20c00 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
20c10 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
20c20 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
20c30 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
20c40 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
20c50 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
20c60 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
20c70 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
20c80 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
20c90 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
20ca0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
20cb0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
20cc0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
20cd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20ce0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
20cf0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
20d00 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
20d10 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20d20 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
20d30 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20d40 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
20d50 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20d60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20d70 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
20d80 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
20d90 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
20da0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
20db0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
20dc0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
20dd0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
20de0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
20df0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
20e00 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
20e10 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
20e20 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
20e30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
20e40 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
20e50 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
20e60 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
20e70 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
20e80 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
20e90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20ea0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
20eb0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
20ec0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
20ed0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
20ee0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20ef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20f00 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
20f10 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
20f20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
20f30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20f40 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
20f50 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
20f60 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
20f70 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
20f80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20f90 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
20fa0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
20fb0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
20fc0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
20fd0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
20fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20ff0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21000 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
21010 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
21020 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21030 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21040 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
21050 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
21060 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
21070 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
21080 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
21090 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
210a0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
210b0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
210c0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
210d0 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
210e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
210f0 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
21100 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
21110 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
21120 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
21130 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
21140 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
21150 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
21160 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
21170 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
21180 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
21190 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
211a0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
211b0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
211c0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
211d0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
211e0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
211f0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
21200 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
21210 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
21220 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
21230 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21240 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
21250 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
21260 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21270 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
21280 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
21290 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
212a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
212b0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
212c0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
212d0 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
212e0 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
212f0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
21300 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
21310 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
21320 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21330 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
21340 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
21350 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
21360 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
21370 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
21380 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
21390 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
213a0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
213b0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
213c0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
213d0 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
213e0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
213f0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
21400 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
21410 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
21420 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21430 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21440 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
21450 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
21460 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
21470 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
21480 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
21490 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
214a0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
214b0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
214c0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
214d0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
214e0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
214f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
21500 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21510 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
21520 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
21530 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
21540 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21550 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
21560 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
21570 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
21580 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
21590 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
215a0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
215b0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
215c0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
215d0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
215e0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
215f0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
21600 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
21610 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21620 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
21630 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
21640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
21650 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
21660 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
21670 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
21680 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
216a0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
216b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
216c0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
216d0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
216e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
216f0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
21700 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
21710 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
21720 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
21730 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
21740 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
21750 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
21760 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
21770 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
21780 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
21790 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
217a0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
217b0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
217c0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
217d0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
217e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
217f0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
21800 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
21810 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
21820 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
21830 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
21840 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
21850 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
21860 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
21870 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
21880 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
21890 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
218a0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
218b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
218c0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
218d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
218e0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
218f0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
21900 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
21910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21920 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
21930 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
21940 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
21950 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21960 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
21970 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
21980 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
21990 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
219a0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
219b0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
219c0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
219d0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
219e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
219f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21a00 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
21a10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21a20 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
21a30 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
21a40 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
21a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21a60 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
21a70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
21a80 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
21a90 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
21aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
21ab0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
21ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
21ad0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
21ae0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
21af0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
21b00 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
21b10 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
21b20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21b30 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
21b40 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
21b50 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
21b60 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
21b70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21b80 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
21b90 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
21ba0 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
21bb0 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
21bc0 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
21bd0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
21be0 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
21bf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21c00 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
21c10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21c20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
21c30 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
21c40 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
21c50 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
21c60 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
21c70 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
21c80 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
21c90 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
21ca0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
21cb0 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
21cc0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
21cd0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
21ce0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21cf0 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
21d00 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
21d10 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
21d20 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
21d30 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
21d40 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
21d50 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21d60 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
21d70 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61  CSR bit of wrFla
21d80 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  g is clear, then
21d90 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
21da0 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  only.** be used 
21db0 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66  for reading.  If
21dc0 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
21dd0 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
21de0 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
21df0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
21e00 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77  reading or for w
21e10 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
21e20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
21e30 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c  riting.** are al
21e40 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61  so met.  These a
21e50 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
21e60 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
21e70 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  et in order.** f
21e80 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65  or writing to be
21e90 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
21ea0 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
21eb0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
21ec0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
21ed0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45   containing BTRE
21ee0 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a  E_WRCSR.**.** 2:
21ef0 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
21f00 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
21f10 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
21f20 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
21f30 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
21f40 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
21f50 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
21f60 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
21f70 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
21f80 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
21f90 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
21fa0 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
21fb0 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
21fc0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
21fd0 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
21fe0 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
21ff0 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
22000 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
22010 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
22020 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
22030 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
22040 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
22050 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
22060 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
22070 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
22080 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
22090 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
220a0 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52  ** The BTREE_FOR
220b0 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72  DELETE bit of wr
220c0 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61  Flag may optiona
220d0 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54  lly be set if BT
220e0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20  REE_WRCSR.** is 
220f0 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45  set.  If FORDELE
22100 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  TE is set, that 
22110 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
22120 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
22130 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72  that.** this cur
22140 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
22150 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f   used to seek to
22160 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72   and delete entr
22170 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ies of an index.
22180 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ** as part of a 
22190 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74  larger DELETE st
221a0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  atement.  The FO
221b0 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20  RDELETE hint is 
221c0 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  not used by.** t
221d0 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
221e0 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79  on.  But in a hy
221f0 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72  pothetical alter
22200 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
22210 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69  ngine .** in whi
22220 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ch index entries
22230 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
22240 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
22250 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
22260 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20  ble.** rows are 
22270 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52  deleted, the FOR
22280 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61  DELETE flag is a
22290 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53   hint that all S
222a0 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a  EEK and DELETE.*
222b0 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  * operations on 
222c0 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20  this cursor can 
222d0 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c  be no-ops and al
222e0 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e  l READ operation
222f0 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e  s can .** return
22300 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62   a null row (2-b
22310 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29  ytes: 0x01 0x00)
22320 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
22330 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
22340 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
22350 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
22360 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
22370 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
22380 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
22390 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
223a0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
223b0 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
223c0 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
223d0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
223e0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
223f0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
22400 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
22410 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
22420 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
22430 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
22440 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
22450 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
22460 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
22470 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
224a0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
224b0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
224e0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
224f0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
22500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22520 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
22530 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
22540 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
22550 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
22560 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
22570 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
22580 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
22590 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
225c0 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
225d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
225e0 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
225f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
22600 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
22610 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
22620 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22640 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
22650 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
22660 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
22670 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
22680 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
22690 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
226a0 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
226b0 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a  g==BTREE_WRCSR .
226c0 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
226d0 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42  ==(BTREE_WRCSR|B
226e0 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20  TREE_FORDELETE) 
226f0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
22700 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
22710 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
22720 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
22730 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
22740 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
22750 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
22760 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
22770 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
22780 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
22790 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
227a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
227b0 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
227c0 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
227d0 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
227e0 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
227f0 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
22800 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
22810 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
22820 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29  0, (wrFlag?2:1))
22830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
22840 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
22850 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
22860 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
22870 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
22880 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
22890 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
228a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
228b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
228c0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
228d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
228e0 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
228f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
22900 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
22910 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
22920 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
22930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
22940 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
22950 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
22960 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
22970 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
22980 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
22990 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
229a0 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
229b0 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
229c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
229d0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  PT;.  }.  if( iT
229e0 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
229f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
22a00 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
22a10 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
22a20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
22a30 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
22a40 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
22a50 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
22a60 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
22a70 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
22a80 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
22a90 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
22aa0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
22ab0 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
22ac0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
22ad0 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
22ae0 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
22af0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
22b00 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
22b10 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
22b20 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
22b30 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
22b40 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
22b50 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
22b60 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
22b70 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
22b80 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
22b90 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
22ba0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
22bb0 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
22bc0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
22bd0 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
22be0 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
22bf0 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
22c00 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
22c10 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
22c20 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
22c30 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
22c40 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
22c50 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
22c60 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
22c70 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
22c80 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
22c90 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
22ca0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
22cb0 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
22cc0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
22cd0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
22ce0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
22cf0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
22d00 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
22d10 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
22d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
22d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22d40 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
22d80 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
22dc0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
22dd0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
22e10 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
22e20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
22e30 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
22e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22e50 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
22e60 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
22e70 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22ea0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
22eb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
22ec0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
22ed0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
22ee0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22ef0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
22f00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22f10 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
22f20 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
22f30 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
22f40 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
22f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22f60 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
22f70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22f80 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
22f90 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
22fa0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
22fb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
22fc0 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
22fd0 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
22fe0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
22ff0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
23000 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
23010 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
23020 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
23030 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
23040 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
23050 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
23060 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
23070 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
23080 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
23090 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
230a0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
230b0 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
230c0 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
230d0 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
230e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
230f0 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
23100 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
23110 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
23120 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
23130 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
23140 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
23150 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
23160 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
23170 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
23180 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
23190 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
231a0 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
231b0 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
231c0 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
231d0 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
231e0 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
231f0 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
23200 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
23210 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
23220 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
23230 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
23240 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23250 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
23260 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
23270 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
23280 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
23290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
232a0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
232b0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
232c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
232d0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
232e0 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
232f0 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
23300 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23310 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
23320 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
23330 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
23340 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
23350 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
23360 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
23370 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
23380 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
23390 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
233a0 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
233b0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
233c0 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73  r(pCur);.    ass
233d0 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
233e0 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
233f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
23400 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
23410 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
23420 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
23430 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
23440 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
23450 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
23460 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
23470 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
23480 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
23490 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
234a0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
234b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
234c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
234d0 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
234e0 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
234f0 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
23500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
23510 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
23520 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
23530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
23540 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
23550 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
23560 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
23570 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
23580 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
23590 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
235a0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
235b0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
235c0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
235d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
235e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
235f0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
23600 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
23610 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
23620 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
23630 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
23640 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
23650 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
23660 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
23670 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
23680 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
23690 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
236a0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
236b0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
236c0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
236d0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
236e0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
236f0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
23700 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
23710 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
23720 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
23730 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
23740 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
23750 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
23760 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
23770 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
23780 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
23790 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
237a0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
237b0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
237c0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
237d0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
237e0 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
237f0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
23800 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
23810 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
23820 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
23830 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
23840 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
23850 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
23860 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  x).#endif.static
23870 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
23880 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
23890 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
238a0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
238b0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
238c0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
238d0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
238e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
238f0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
23900 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  y;.    btreePars
23910 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
23920 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
23930 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
23940 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
23950 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65  se{.    assertCe
23960 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23970 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
23980 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
23990 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
239a0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
239b0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
239c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
239d0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
239e0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
239f0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
23a00 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
23a10 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
23a20 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
23a30 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
23a40 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
23a50 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
23a60 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
23a70 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
23a80 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
23a90 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
23aa0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
23ab0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
23ac0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
23ad0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
23ae0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23af0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
23b00 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
23b10 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
23b20 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
23b30 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
23b40 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
23b50 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
23b60 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
23b70 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
23b80 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
23b90 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
23ba0 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
23bb0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
23bc0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
23bd0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
23be0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
23bf0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
23c00 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
23c10 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
23c20 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
23c30 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
23c40 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
23c50 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
23c60 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
23c70 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
23c80 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
23c90 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
23ca0 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
23cb0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
23cc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23cd0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
23ce0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
23cf0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
23d00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23d10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23d20 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23d30 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23d40 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
23d50 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
23d60 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
23d70 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ey;.  return SQL
23d80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23d90 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
23da0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
23db0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
23dc0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
23dd0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
23de0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
23df0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23e00 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
23e10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
23e20 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
23e30 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
23e40 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
23e50 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
23e60 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
23e70 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
23e80 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
23e90 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
23ea0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
23eb0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
23ec0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
23ed0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
23ee0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
23ef0 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
23f00 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
23f10 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
23f20 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
23f30 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
23f40 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
23f50 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
23f60 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
23f70 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
23f80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
23f90 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
23fa0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
23fb0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
23fc0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
23fd0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
23fe0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23ff0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24010 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
24020 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
24030 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
24040 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
24050 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24060 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24070 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b  intKeyLeaf==1 );
24080 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
24090 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
240a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
240b0 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
240c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
240d0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
240e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
240f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
24100 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
24110 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
24120 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
24130 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
24140 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24150 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
24160 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
24170 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24180 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
24190 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
241a0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
241b0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
241c0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
241d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
241e0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
241f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24200 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
24210 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
24220 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
24230 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
24240 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
24250 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
24260 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
24270 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
24280 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
24290 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
242a0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
242b0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
242c0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
242d0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
242e0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
242f0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
24300 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
24310 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
24320 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
24330 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
24340 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
24350 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
24360 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
24370 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
24380 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
24390 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
243a0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
243b0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
243c0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
243d0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
243e0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
243f0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
24400 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
24410 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
24420 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
24430 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
24440 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
24450 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
24460 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
24470 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
24480 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
24490 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
244a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
244b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
244c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
244d0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244f0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
24500 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
24510 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
24520 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
24530 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
24540 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
24550 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
24560 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
24570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24580 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
24590 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
245a0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
245b0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
245c0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
245d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
245e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
245f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24600 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
24610 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
24620 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24630 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24640 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
24650 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
24660 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
24670 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
24680 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
24690 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
246a0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
246b0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
246c0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
246d0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
246e0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
246f0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
24700 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
24710 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
24720 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
24730 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
24740 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
24750 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
24760 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
24770 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
24780 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24790 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
247a0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
247b0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
247c0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
247d0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
247e0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
247f0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
24800 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
24810 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
24820 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
24830 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
24840 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
24850 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24860 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
24870 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
24880 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
24890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
248a0 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
248b0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
248c0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
248d0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
248e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
248f0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
24900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
24910 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
24920 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
24930 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
24940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24950 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
24960 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24970 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
24980 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
24990 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
249a0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
249b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
249c0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
249d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
249e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
249f0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
24a00 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
24a10 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
24a20 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
24a30 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
24a40 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
24a50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
24a60 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
24a70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24a80 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
24a90 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
24aa0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
24ab0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
24ac0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
24ad0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
24ae0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
24af0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
24b00 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
24b10 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
24b20 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
24b30 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
24b40 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
24b50 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
24b60 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
24b70 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
24b80 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
24b90 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
24ba0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
24bb0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
24bc0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
24bd0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
24be0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
24bf0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
24c00 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
24c10 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
24c20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
24c30 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24c40 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
24c50 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
24c60 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
24c70 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
24c80 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
24c90 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
24ca0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24cb0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
24cc0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24ce0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
24cf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24d20 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
24d30 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
24d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
24d50 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
24d60 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
24d70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
24d80 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
24d90 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
24da0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
24db0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
24dc0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
24dd0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
24de0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
24df0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24e00 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
24e10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
24e20 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24e50 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
24e60 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
24e70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24e80 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
24e90 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
24ea0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
24eb0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24ec0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
24ed0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
24ee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24ef0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24f00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24f10 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
24f20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
24f30 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
24f40 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
24f50 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
24f60 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24f70 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
24f80 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
24f90 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
24fa0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
24fb0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
24fc0 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
24fd0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
24fe0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
24ff0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25000 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
25010 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25020 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
25030 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25040 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
25050 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
25060 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
25070 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
25080 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
25090 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
250a0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
250b0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
250c0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
250d0 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
250e0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
250f0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25100 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
25110 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
25120 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
25130 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
25140 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
25150 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
25160 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
25170 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
25180 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
25190 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
251a0 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
251b0 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
251c0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
251d0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
251e0 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
251f0 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
25200 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
25210 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
25220 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
25230 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
25240 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
25250 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
25260 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
25270 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
25280 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
25290 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
252a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
252b0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
252c0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
252d0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
252e0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
252f0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25300 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
25310 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
25320 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
25330 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
25340 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
25350 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
25360 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
25370 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
25380 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
25390 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
253a0 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
253b0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
253c0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
253d0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
253e0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
253f0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25400 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
25410 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
25420 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
25430 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
25440 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
25450 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
25460 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25470 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25480 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
25490 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
254a0 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
254b0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
254c0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
254d0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
254e0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
254f0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25500 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
25510 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
25520 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
25530 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
25540 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
25550 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
25560 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
25570 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
25580 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
25590 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
255a0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
255b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
255c0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
255d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
255e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
255f0 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
25600 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
25610 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
25620 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25630 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
25640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
25650 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
25660 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
25670 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
25680 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
25690 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
256a0 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
256b0 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
256c0 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
256f0 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
25700 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
25710 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
25720 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
25730 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25740 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25760 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25770 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
25780 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
25790 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
257a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
257b0 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
257c0 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
257d0 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
257e0 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
257f0 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
25800 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
25810 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
25820 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
25830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25840 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25850 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
25860 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
25870 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
25880 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
25890 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
258a0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
258b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
258c0 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
258d0 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
258e0 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
258f0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
25900 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
25910 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
25920 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
25930 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
25940 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
25950 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
25960 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
25970 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
25980 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
25990 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
259a0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
259b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
259c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
259d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
259e0 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
259f0 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
25a00 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
25a10 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
25a20 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
25a30 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
25a40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25a50 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
25a60 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
25a70 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
25a80 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
25a90 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
25aa0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
25ab0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25ac0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
25ad0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
25ae0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
25af0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
25b00 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
25b10 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
25b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
25b30 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
25b40 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
25b50 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
25b60 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
25b70 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
25b80 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
25b90 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
25ba0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
25bb0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
25bc0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
25bd0 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
25be0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
25bf0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
25c00 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
25c10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
25c20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
25c30 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
25c40 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
25c50 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
25c60 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
25c70 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
25c80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
25c90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
25ca0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
25cb0 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
25cc0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
25cd0 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
25ce0 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
25cf0 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
25d00 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
25d10 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
25d20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
25d30 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
25d40 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
25d50 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
25d60 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
25d70 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
25d80 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
25d90 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
25da0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
25db0 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
25dc0 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
25dd0 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
25de0 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
25df0 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
25e00 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
25e10 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
25e20 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
25e30 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
25e40 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
25e50 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
25e60 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
25e70 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
25e80 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
25e90 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
25ea0 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
25eb0 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
25ec0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
25ed0 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
25ee0 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
25ef0 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
25f00 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
25f10 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
25f20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
25f30 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
25f40 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
25f50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
25f60 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
25f70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25f80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25f90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25fa0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
25fb0 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
25fc0 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
25fd0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
25fe0 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
25ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26010 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
26020 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
26030 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
26040 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
26050 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
26060 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
26070 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
26080 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
26090 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
260a0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
260b0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
260c0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
260d0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
260e0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
260f0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
26100 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
26110 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
26120 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
26130 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
26140 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
26150 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
26160 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
26170 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
26180 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
26190 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
261a0 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
261b0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
261c0 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
261d0 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
261e0 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
261f0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
26200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26210 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
26220 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
26230 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
26240 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
26250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
26260 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
26270 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
26280 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26290 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
262a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
262b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
262c0 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
262d0 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
262e0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
262f0 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
26300 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
26310 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
26320 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
26330 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
26340 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
26350 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
26360 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
26370 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
26380 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
26390 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
263a0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
263b0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
263c0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
263d0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
263e0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
263f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
26400 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
26410 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
26420 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
26430 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
26440 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
26450 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
26460 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
26470 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
26480 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
26490 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
264a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
264b0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
264c0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
264d0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
264e0 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
264f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
26500 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
26510 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
26520 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
26530 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
26540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26550 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
26560 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26570 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
26580 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26590 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
265a0 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
265b0 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
265c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
265d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
265e0 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
265f0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26600 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26610 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
26620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26630 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
26640 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
26650 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
26660 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26670 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
26680 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
26690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
266a0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
266b0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
266c0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
266d0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
266e0 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
266f0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26700 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
26710 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
26720 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
26730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
26740 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
26750 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
26760 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
26770 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
26780 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
26790 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
267a0 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
267b0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
267c0 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
267d0 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
267e0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
267f0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26800 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
26810 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
26820 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
26830 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
26840 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
26850 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
26860 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
26870 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
26880 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
26890 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
268a0 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
268b0 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
268c0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
268d0 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
268e0 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
268f0 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
26900 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
26910 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
26920 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
26930 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
26940 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
26950 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
26960 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
26970 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
26980 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
26990 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
269a0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
269b0 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
269c0 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
269d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
269e0 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
269f0 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
26a00 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
26a10 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
26a20 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
26a30 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
26a40 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
26a50 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
26a60 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
26a70 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
26a80 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
26a90 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
26aa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
26ab0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26ac0 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
26ad0 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
26b00 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26b10 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
26b50 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
26b60 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b90 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
26ba0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
26bb0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
26bc0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
26bd0 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
26be0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
26bf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
26c00 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
26c10 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
26c20 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
26c30 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
26c40 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
26c50 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
26c60 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
26c70 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
26c80 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
26c90 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
26cc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26cd0 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
26ce0 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
26cf0 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
26d00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26d10 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
26d20 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d40 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
26d50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26d60 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
26d70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26d80 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
26d90 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
26da0 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
26db0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
26dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
26dd0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26de0 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
26df0 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
26e00 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
26e10 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
26e20 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
26e30 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
26e40 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
26e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26e60 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
26e70 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
26e80 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
26e90 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
26ea0 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
26eb0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
26ec0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
26ed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26ef0 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
26f00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
26f10 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
26f20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
26f30 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26f40 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
26f50 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
26f60 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
26f70 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
26f80 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
26f90 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
26fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
26fb0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
26fc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26fd0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
26fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26ff0 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
27000 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
27010 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
27020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
27030 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27040 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
27050 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
27060 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
27070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27080 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27090 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
270a0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
270b0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
270c0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
270d0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
270e0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
270f0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
27100 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
27110 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
27120 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
27130 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
27140 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
27150 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
27160 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
27170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
27180 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
27190 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
271a0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
271b0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
271c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
271d0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
271e0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
271f0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
27200 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
27210 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
27220 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
27230 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
27240 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
27250 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27260 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27270 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27280 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27290 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
272a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
272b0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
272c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
272d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
272e0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
272f0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
27300 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27310 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
27320 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
27330 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
27340 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
27350 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
27360 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
27370 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
27380 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
27390 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
273a0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
273b0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
273c0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
273d0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
273e0 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
273f0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
27400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
27410 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
27420 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
27430 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
27440 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
27450 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
27460 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
27470 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
27480 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
27490 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
274a0 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
274b0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
274c0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
274d0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
274e0 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
274f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
27500 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
27510 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27520 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
27530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
27540 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
27550 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27560 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
27570 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
27580 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
27590 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
275a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
275b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
275c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
275d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
275e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
275f0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
27600 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27610 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
27620 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
27630 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
27640 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27650 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
27660 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
27670 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
27680 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
27690 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
276a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
276b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
276c0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
276d0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
276e0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
276f0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
27700 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
27710 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
27720 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
27730 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
27740 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
27750 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
27760 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
27770 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
27780 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
27790 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
277a0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
277b0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
277c0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
277d0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
277e0 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
277f0 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
27800 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
27810 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
27820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27830 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
27840 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
27850 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
27860 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
27870 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
27880 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
27890 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
278a0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
278b0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
278c0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
278d0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
278e0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
278f0 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
27900 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
27910 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
27920 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
27930 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
27940 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
27950 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
27960 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
27970 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
27980 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
27990 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
279a0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
279b0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
279c0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
279d0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
279e0 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
279f0 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
27a00 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
27a10 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
27a20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
27a30 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
27a40 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
27a50 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
27a60 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
27a70 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
27a80 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
27a90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
27aa0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
27ab0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
27ac0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
27ad0 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
27ae0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
27af0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27b00 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
27b10 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d  e */.){.  u32 am
27b20 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
27b30 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
27b40 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
27b50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27b60 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
27b70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27b80 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27b90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27ba0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
27bb0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
27bc0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
27bd0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
27be0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
27bf0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27c00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27c10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27c20 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27c40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
27c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27c60 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27c70 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
27c80 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27c90 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
27ca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27cb0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27cc0 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
27cd0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27ce0 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
27cf0 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
27d00 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
27d10 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27d20 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
27d30 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
27d40 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
27d50 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
27d60 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
27d70 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
27d80 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
27d90 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
27da0 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
27db0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
27dc0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
27dd0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
27de0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
27df0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
27e00 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
27e10 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
27e20 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
27e30 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
27e40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27e50 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
27e60 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
27e70 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
27e80 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
27e90 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
27ea0 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
27eb0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
27ec0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
27ed0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
27ee0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
27ef0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
27f00 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
27f10 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
27f20 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
27f30 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
27f40 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
27f50 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
27f60 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
27f70 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
27f80 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
27f90 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
27fa0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
27fb0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
27fc0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
27fd0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
27fe0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
27ff0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
28000 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
28010 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
28020 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
28030 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
28040 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
28050 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
28060 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
28070 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
28080 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
28090 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
280a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
280b0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
280c0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
280d0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
280e0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
280f0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
28100 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
28110 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
28120 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28140 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28150 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28160 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28170 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
28180 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
28190 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
281a0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
281b0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
281c0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
281d0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
281e0 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
281f0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
28200 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
28210 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
28220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28230 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
28240 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
28250 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
28260 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
28270 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
28280 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28290 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
282a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
282b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
282c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
282d0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
282e0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
282f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28300 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
28310 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
28320 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
28330 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
28340 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28350 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
28360 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28370 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
28380 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28390 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
283a0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
283b0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75  ->iPage++;.  pCu
283c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
283d0 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74  Page] = 0;.  ret
283e0 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
283f0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
28400 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70   &pCur->apPage[p
28410 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
28440 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
28450 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
28460 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
28470 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
28480 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
28490 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
284a0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
284b0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
284c0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
284d0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
284e0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
284f0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
28500 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
28510 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
28520 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
28530 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
28540 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
28550 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
28560 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
28570 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
28580 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
28590 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
285a0 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
285b0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
285c0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
285d0 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
285e0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
285f0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65  he conditions te
28600 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74  sted below might
28610 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20   not be true.   
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61           ** in a
28640 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
28650 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
28660 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
28670 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
28680 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
28690 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
286a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
286b0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
286c0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
286d0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
286e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
286f0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
28700 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
28710 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
28720 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
28730 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
28740 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
28750 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
28760 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
28770 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
28780 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
28790 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
287a0 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
287b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
287c0 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
287d0 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
287e0 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
287f0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
28800 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
28810 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
28820 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
28830 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
28840 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
28850 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
28860 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
28870 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
28880 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
28890 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
288a0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
288b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
288c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
288d0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
288e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
288f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28900 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28910 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
28920 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
28930 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
28940 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
28950 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
28960 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
28970 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
28980 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28990 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  ]->pgno.  );.  t
289a0 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
289b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
289c0 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
289d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
289e0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
289f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28a00 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
28a10 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28a20 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28a30 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65  lidOvfl);.  rele
28a40 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
28a50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28a60 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a  ->iPage--]);.}..
28a70 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
28a80 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
28a90 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
28aa0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
28ab0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
28ac0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
28ad0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
28ae0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
28af0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
28b00 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
28b10 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28b20 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
28b30 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
28b40 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
28b50 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
28b60 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
28b70 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
28b80 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
28b90 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
28ba0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
28bb0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
28bc0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
28bd0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
28be0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
28bf0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
28c00 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
28c10 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
28c20 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
28c30 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
28c40 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
28c50 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
28c60 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
28c70 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
28c80 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
28c90 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
28ca0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
28cb0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
28cc0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
28cd0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
28ce0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
28cf0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
28d00 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
28d10 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
28d20 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
28d30 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
28d40 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
28d50 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
28d60 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
28d70 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
28d80 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
28d90 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
28da0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
28db0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
28dc0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
28dd0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
28de0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
28df0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
28e00 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
28e10 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
28e20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
28e30 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
28e40 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
28e50 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
28e60 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
28e70 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
28e80 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
28e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28ea0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
28eb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
28ec0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
28ed0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28ee0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
28ef0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28f00 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
28f10 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
28f20 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
28f30 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
28f40 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
28f50 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
28f60 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
28f70 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
28f80 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
28f90 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28fa0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
28fb0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
28fc0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
28fd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28fe0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
28ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29000 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
29010 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
29020 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
29030 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
29040 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
29050 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
29060 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
29070 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
29080 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61  while( pCur->iPa
29090 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ge ){.      asse
290a0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
290b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30  [pCur->iPage]!=0
290c0 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   );.      releas
290d0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
290e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
290f0 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d  iPage--]);.    }
29100 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
29110 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
29120 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
29130 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29140 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
29150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
29160 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
29170 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
29180 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
29190 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
291a0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
291b0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
291c0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
291d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
291e0 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
291f0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
29200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29220 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29230 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
29240 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
29260 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
29270 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
29280 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29290 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a  0]->intKey;.  }.
292a0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
292b0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
292c0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
292d0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
292e0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
292f0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
29300 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
29310 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
29320 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
29330 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
29340 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
29350 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
29360 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
29370 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
29380 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
29390 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
293a0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
293b0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
293c0 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
293d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
293e0 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
293f0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
29400 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
29410 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
29420 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
29430 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
29440 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
29450 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
29460 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
29470 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
29480 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
29490 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
294a0 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
294b0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
294c0 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
294d0 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
294e0 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
294f0 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
29500 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
29510 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
29520 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
29530 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
29540 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
29550 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
29560 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
29570 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
29580 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
29590 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
295a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
295b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
295c0 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  }..  pCur->aiIdx
295d0 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
295e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
295f0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
29600 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
29610 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
29620 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
29630 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  );..  if( pRoot-
29640 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
29650 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29660 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
29670 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
29680 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
29690 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
296a0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
296b0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
296c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
296d0 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
296e0 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
296f0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
29700 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
29710 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29720 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
29730 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
29740 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
29750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
29760 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29770 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
29780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29790 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
297a0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
297b0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
297c0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
297d0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
297e0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
297f0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
29800 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
29810 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
29820 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
29830 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
29840 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
29850 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
29860 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
29870 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
29880 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
29890 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
298a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
298b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
298c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
298d0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
298e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
298f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29900 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29910 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
29920 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
29930 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29940 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
29950 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
29960 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
29970 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
29980 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
29990 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
299a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
299b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
299c0 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
299d0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
299e0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
299f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29a00 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
29a10 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
29a20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
29a30 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
29a40 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
29a50 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
29a60 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
29a70 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
29a80 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
29a90 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
29aa0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
29ab0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
29ac0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
29ad0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
29ae0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
29af0 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
29b00 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
29b10 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
29b20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29b30 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
29b40 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
29b50 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
29b60 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
29b70 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
29b80 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
29b90 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
29ba0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
29bb0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
29bc0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
29bd0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
29be0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
29bf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
29c00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
29c10 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
29c20 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29c30 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29c40 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
29c50 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
29c60 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
29c70 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
29c80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
29c90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
29ca0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
29cb0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
29cc0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
29cd0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
29ce0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
29cf0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
29d00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
29d10 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
29d20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29d30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
29d40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29d50 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
29d60 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
29d70 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
29d80 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
29d90 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
29da0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
29db0 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
29dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29dd0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
29de0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
29df0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
29e00 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
29e10 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
29e20 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
29e30 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
29e40 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
29e50 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
29e60 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
29e70 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
29e80 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
29e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
29ea0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
29eb0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
29ec0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
29ed0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29ee0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29ef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29f00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29f10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
29f20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
29f30 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
29f40 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
29f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f60 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
29f70 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
29f80 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
29f90 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
29fa0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
29fb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29fc0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
29fd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
29fe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29ff0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a000 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a010 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2a020 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2a030 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2a040 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2a050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a060 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2a070 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2a080 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2a090 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a0a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2a0b0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2a0c0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2a0d0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2a0e0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2a0f0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2a100 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2a110 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a120 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2a130 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
2a140 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2a150 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2a160 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
2a170 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a180 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a1a0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2a1b0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2a1c0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
2a1d0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
2a1e0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
2a1f0 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
2a200 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
2a210 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
2a220 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2a230 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2a240 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2a250 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
2a260 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2a270 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
2a280 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
2a290 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
2a2a0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
2a2b0 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
2a2c0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2a2d0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
2a2e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2a2f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
2a300 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
2a310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a320 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
2a330 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
2a340 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
2a350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2a360 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a370 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
2a380 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a390 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
2a3a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2a3b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a3c0 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
2a3d0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2a3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2a3f0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2a400 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2a410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a420 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2a430 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a440 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
2a450 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2a460 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2a470 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a480 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2a490 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2a4a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a4b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a4c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2a4d0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
2a4e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a4f0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2a500 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
2a510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
2a530 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2a540 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2a550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a560 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2a570 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
2a580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
2a590 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a5a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2a5b0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
2a5c0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
2a5d0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
2a5e0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
2a5f0 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
2a600 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
2a610 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
2a620 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
2a630 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
2a640 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
2a650 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
2a660 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
2a670 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
2a680 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
2a690 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
2a6a0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
2a6b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
2a6c0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
2a6d0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
2a6e0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
2a6f0 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
2a700 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
2a710 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
2a720 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
2a730 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
2a740 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
2a750 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2a760 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
2a770 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
2a780 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
2a790 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
2a7a0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2a7b0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
2a7c0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2a7d0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
2a7e0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
2a7f0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
2a800 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
2a810 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
2a820 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
2a830 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
2a840 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
2a850 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2a860 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
2a870 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2a880 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2a890 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2a8b0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
2a8c0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
2a8d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2a8e0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
2a8f0 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
2a900 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
2a910 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
2a920 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
2a930 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
2a940 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2a950 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a960 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2a970 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2a980 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
2a990 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
2a9a0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
2a9b0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
2a9c0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2a9d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2a9e0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2aa00 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
2aa10 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2aa20 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  ** For index tab
2aa30 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79  les, the pIdxKey
2aa40 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69  ->eqSeen field i
2aa50 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  s set to 1 if th
2aa60 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e  ere.** exists an
2aa70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2aa80 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79  ble that exactly
2aa90 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79   matches pIdxKey
2aaa0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
2aab0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2aac0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
2aad0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2aae0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2aaf0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
2ab00 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2ab10 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
2ab20 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
2ab30 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ab50 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
2ab60 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
2ab70 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2ab80 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
2ab90 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
2aba0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
2abb0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
2abc0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2abd0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
2abe0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2abf0 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
2ac00 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
2ac10 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
2ac20 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ac30 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2ac40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ac50 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2ac60 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2ac70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2ac80 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2ac90 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2aca0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2acb0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2acc0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2acd0 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
2ace0 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
2acf0 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
2ad00 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
2ad10 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
2ad20 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
2ad30 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
2ad40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ad50 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
2ad60 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ad70 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
2ad80 20 20 26 26 20 70 43 75 72 2d 3e 63 75 72 49 6e    && pCur->curIn
2ad90 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
2ada0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2adb0 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2adc0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2add0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ade0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2adf0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2ae00 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2ae10 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  st)!=0 && pCur->
2ae20 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2ae30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2ae40 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
2ae50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ae60 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2ae70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2ae80 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2ae90 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2aea0 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2aeb0 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2aec0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2aed0 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2aee0 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2aef0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2af00 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2af10 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2af20 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2af30 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2af40 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2af50 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2af60 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2af70 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2af80 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2af90 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2afa0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2afb0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2afc0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2afd0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2afe0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2aff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b000 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2b010 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2b020 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
2b030 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2b040 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b050 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
2b060 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b070 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2b080 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
2b090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b0a0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2b0b0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2b0c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b0d0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b0e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b0f0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2b100 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
2b110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2b120 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2b130 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2b140 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2b150 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2b160 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2b170 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2b180 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2b190 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2b1a0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2b1b0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2b1c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b1d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b1e0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2b1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b210 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2b220 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
2b230 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
2b240 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
2b250 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
2b260 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2b270 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2b280 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
2b290 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
2b2a0 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
2b2b0 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
2b2c0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
2b2d0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2b2e0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
2b2f0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
2b300 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
2b310 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
2b320 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
2b330 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
2b340 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
2b350 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
2b360 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
2b370 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
2b380 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
2b390 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
2b3a0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
2b3b0 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
2b3c0 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
2b3d0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
2b3e0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
2b3f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2b400 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
2b410 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2b420 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
2b430 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
2b440 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
2b450 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
2b460 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
2b470 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
2b480 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
2b490 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
2b4a0 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
2b4b0 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
2b4c0 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2b4d0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2b4e0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2b4f0 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
2b500 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
2b510 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
2b520 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
2b530 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2b540 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2b550 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2b560 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
2b570 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2b580 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2b590 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
2b5a0 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
2b5b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b5c0 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
2b5d0 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
2b5e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b5f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
2b600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b610 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
2b620 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
2b630 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2b640 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
2b650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2b660 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2b670 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2b680 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
2b690 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2b6a0 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
2b6b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b6c0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2b6d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2b6e0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
2b6f0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2b700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b710 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2b720 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
2b730 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2b740 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2b750 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2b760 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2b770 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
2b780 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2b790 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b7a0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2b7b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2b7c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b7d0 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
2b7e0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
2b7f0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
2b800 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
2b810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b820 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2b830 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2b840 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b850 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b860 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2b870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b880 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2b890 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2b8a0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2b8b0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2b8c0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2b8d0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
2b8e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b8f0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2b900 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
2b910 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
2b920 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
2b930 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
2b940 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2b950 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2b960 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
2b970 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
2b980 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
2b990 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
2b9a0 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
2b9b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
2b9c0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
2b9d0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
2b9e0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
2b9f0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
2ba00 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
2ba10 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
2ba20 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
2ba30 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
2ba40 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
2ba50 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2ba60 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
2ba70 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
2ba80 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
2ba90 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2baa0 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
2bab0 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
2bac0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
2bad0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
2bae0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
2baf0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
2bb00 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
2bb10 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
2bb20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
2bb30 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
2bb40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
2bb50 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
2bb60 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2bb70 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
2bb80 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
2bb90 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2bba0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
2bbb0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2bbc0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
2bbd0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
2bbe0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
2bbf0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2bc00 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
2bc10 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
2bc20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
2bc30 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2bc40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bc50 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
2bc60 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2bc70 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2bc80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2bc90 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2bca0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
2bcb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2bcc0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
2bcd0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
2bce0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
2bcf0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
2bd00 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
2bd10 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
2bd20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2bd30 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
2bd40 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
2bd50 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2bd60 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
2bd70 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
2bd80 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2bd90 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
2bda0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2bdb0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2bdc0 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
2bdd0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2bde0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2bdf0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2be00 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
2be10 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2be20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2be30 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2be40 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
2be50 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
2be60 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
2be70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
2be80 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
2be90 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
2bea0 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
2beb0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
2bec0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
2bed0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
2bee0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
2bef0 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
2bf00 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
2bf10 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
2bf20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
2bf30 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
2bf40 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
2bf50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2bf60 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2bf70 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f  rrupt, the xReco
2bf80 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e  rdCompare routin
2bf90 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20  e may read.     
2bfa0 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77       ** up to tw
2bfb0 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74  o varints past t
2bfc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2bfd0 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31  ffer. An extra 1
2bfe0 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  8 .          ** 
2bff0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
2c000 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   is allocated at
2c010 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2c020 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20  buffer in.      
2c030 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
2c040 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20   happens.  */.  
2c050 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
2c060 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2c070 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
2c080 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
2c090 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
2c0a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2c0b0 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
2c0c0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  l(pPage, pCellBo
2c0d0 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
2c0e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
2c0f0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
2c100 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
2c110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2c120 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72  ell<0 );   /* Tr
2c130 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69  ue if key size i
2c140 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a  s 2^32 or more *
2c150 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2c160 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29  case( nCell==0 )
2c170 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2c180 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2c190 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20  80 0x00 */.     
2c1a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2c1b0 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49  Cell==1 );  /* I
2c1c0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2c1d0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31    0x80 0x80 0x01
2c1e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c1f0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32  stcase( nCell==2
2c200 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
2c210 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20  legal index key 
2c220 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  size */.        
2c230 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b    if( nCell<2 ){
2c240 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2c250 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2c260 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2c270 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c280 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2c290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
2c2a0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
2c2b0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
2c2c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c2d0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c2f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2c300 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2c310 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c320 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c330 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c340 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c350 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2c360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2c370 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2c380 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2c390 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2c3a0 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20  lKey, 2);.      
2c3b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2c3c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c3d0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2c3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2c3f0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2c400 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c410 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2c420 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2c430 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
2c440 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2c450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2c460 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2c470 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2c480 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
2c490 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c4a0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
2c4b0 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
2c4c0 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
2c4d0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2c4e0 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
2c4f0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
2c500 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
2c510 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c520 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
2c530 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2c540 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2c550 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2c560 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2c570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c580 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2c590 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2c5a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2c5b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c5c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2c5d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c5e0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c5f0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2c600 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
2c610 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
2c620 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
2c630 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c640 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c650 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2c660 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
2c670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c680 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2c690 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2c6a0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2c6b0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
2c6c0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2c6d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
2c6e0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
2c6f0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2c700 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
2c710 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c720 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
2c730 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2c740 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c750 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c760 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
2c770 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c780 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
2c790 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2c7a0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2c7b0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
2c7c0 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
2c7d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c7e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c7f0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
2c800 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2c810 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
2c820 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2c830 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2c840 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2c850 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2c860 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2c870 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2c880 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2c890 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2c8a0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2c8b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c8c0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
2c8d0 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2c8e0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2c8f0 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2c900 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2c910 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2c920 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2c930 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2c940 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2c950 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2c960 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
2c970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2c980 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2c990 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2c9a0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2c9b0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2c9c0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2c9d0 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2c9e0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2c9f0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2ca00 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2ca10 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2ca20 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2ca30 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2ca40 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2ca50 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2ca60 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2ca70 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2ca80 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2ca90 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2caa0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2cab0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2cac0 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2cad0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2cae0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2caf0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2cb00 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2cb10 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2cb20 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2cb30 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2cb40 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2cb50 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2cb60 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2cb70 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2cb80 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2cb90 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2cba0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2cbb0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2cbc0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2cbd0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2cbe0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2cbf0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2cc00 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2cc10 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2cc20 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2cc30 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
2cc40 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2cc50 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2cc60 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
2cc70 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
2cc80 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
2cc90 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2cca0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2ccb0 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2ccc0 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2ccd0 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2cce0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2ccf0 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2cd00 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2cd10 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2cd20 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2cd30 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2cd40 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2cd50 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2cd60 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2cd70 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2cd80 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2cd90 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2cda0 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2cdb0 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2cdc0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2cdd0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2cde0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2cdf0 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2ce00 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2ce10 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2ce20 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2ce30 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2ce40 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2ce50 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2ce60 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2ce70 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2ce80 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2ce90 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2cea0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2ceb0 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2cec0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2ced0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2cee0 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2cef0 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2cf00 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2cf10 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2cf20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2cf30 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2cf40 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2cf50 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2cf60 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2cf70 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2cf80 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2cf90 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2cfa0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2cfb0 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2cfc0 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2cfd0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cfe0 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2cff0 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2d000 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2d010 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2d020 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2d030 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2d040 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2d050 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2d060 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2d070 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2d080 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2d090 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d0a0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2d0b0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2d0c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2d0d0 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2d0e0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2d0f0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d100 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2d110 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2d120 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2d130 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  vfl)==0 );.    r
2d140 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2d150 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2d160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d190 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2d1a0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2d1b0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2d1c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2d1d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d1f0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2d200 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d210 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d220 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2d230 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d240 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2d250 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2d260 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2d270 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2d280 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
2d290 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2d2a0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2d2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d2c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d2d0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2d2e0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2d2f0 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2d300 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d310 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
2d320 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
2d330 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2d340 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2d350 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
2d360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d370 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
2d380 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2d390 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
2d3a0 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
2d3b0 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
2d3c0 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
2d3d0 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
2d3e0 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
2d3f0 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
2d400 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
2d410 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
2d420 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
2d430 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
2d440 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
2d450 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
2d460 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
2d470 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
2d480 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
2d490 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
2d4a0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
2d4b0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
2d4c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
2d4d0 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
2d4e0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
2d4f0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2d500 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
2d510 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2d520 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2d530 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2d540 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2d550 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2d560 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65  urn rc;.      re
2d570 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2d580 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2d590 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
2d5a0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2d5b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2d5c0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2d5d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2d5e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2d5f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2d610 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2d620 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
2d630 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2d640 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2d650 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
2d660 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d670 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
2d680 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2d690 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2d6a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2d6b0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2d6c0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2d6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2d6e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d6f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2d700 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2d710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d720 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d730 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d740 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d750 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65    }.}.int sqlite
2d760 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
2d770 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2d780 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pRes){.  MemPage
2d790 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
2d7a0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2d7b0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2d7c0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2d7d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2d7e0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2d7f0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2d800 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2d810 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2d820 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2d830 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2d840 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2d850 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2d860 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2d870 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2d880 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2d890 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2d8a0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2d8b0 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2d8c0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2d8d0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2d8e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2d8f0 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  e];.  if( (++pCu
2d900 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d910 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e  Page])>=pPage->n
2d920 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2d930 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d940 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75  age]--;.    retu
2d950 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2d960 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2d970 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2d980 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2d9a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2d9b0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2d9c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d9d0 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2d9e0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2d9f0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2da00 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2da10 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2da20 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2da30 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2da40 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2da50 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2da60 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2da70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2da80 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2da90 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2daa0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2dab0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2dac0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2dad0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2dae0 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
2daf0 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2db00 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2db10 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2db20 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
2db30 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2db40 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2db50 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
2db60 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
2db70 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2db80 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2db90 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2dba0 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2dbb0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2dbc0 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2dbd0 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2dbe0 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2dbf0 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2dc00 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2dc10 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2dc20 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2dc30 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2dc40 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2dc50 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2dc60 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2dc70 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2dc80 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2dc90 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2dca0 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2dcb0 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2dcc0 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2dcd0 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2dce0 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2dcf0 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2dd00 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2dd10 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2dd20 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2dd30 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2dd40 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2dd50 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2dd60 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2dd70 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2dd80 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2dd90 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2dda0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2ddb0 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2ddc0 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2ddd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2dde0 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2ddf0 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2de00 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2de10 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2de20 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2de30 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2de40 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2de50 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2de60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2de70 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2de80 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2de90 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2dea0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2deb0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2dec0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2ded0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2dee0 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es==0 );.  asser
2def0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2df00 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2df10 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2df20 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2df30 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2df40 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42  & (BTCF_AtLast|B
2df50 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2df60 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d  CF_ValidNKey))==
2df70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2df80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2df90 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2dfa0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2dfb0 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63  _VALID ){.    rc
2dfc0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2dfd0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2dfe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2e000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e010 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2e020 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2e030 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
2e040 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
2e050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2e070 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2e080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e090 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2e0a0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2e0b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e0c0 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
2e0d0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2e0e0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2e0f0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2e100 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
2e110 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
2e120 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
2e130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e140 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2e150 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2e160 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
2e170 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2e180 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2e190 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2e1a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2e1b0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2e1c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
2e1d0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2e1e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2e1f0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2e200 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2e210 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2e220 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
2e230 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2e240 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
2e250 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2e260 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2e270 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
2e280 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2e2a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2e2b0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2e2c0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2e2d0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2e2e0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2e2f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e300 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2e310 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2e320 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2e330 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2e340 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2e350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2e360 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2e370 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2e380 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
2e390 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
2e3a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2e3b0 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
2e3c0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2e3d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e3e0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2e3f0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
2e400 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2e410 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
2e420 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2e430 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
2e440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e450 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2e460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
2e470 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
2e480 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2e490 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2e4a0 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  s){.  assert( cu
2e4b0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e4c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e4d0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2e4e0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2e4f0 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2e500 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2e510 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2e520 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e530 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2e540 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
2e550 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2e560 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2e570 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2e580 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
2e590 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2e5a0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2e5b0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2e5c0 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
2e5d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2e5e0 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
2e5f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e600 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
2e610 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2e620 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
2e630 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2e640 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2e650 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2e660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2e680 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
2e690 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2e6a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
2e6b0 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
2e6c0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
2e6d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2e6e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e6f0 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
2e700 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
2e710 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
2e720 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
2e730 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
2e740 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
2e750 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2e760 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
2e770 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
2e780 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2e790 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
2e7a0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
2e7b0 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
2e7c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2e7d0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
2e7e0 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
2e7f0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
2e800 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
2e810 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
2e820 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e  NULL in the even
2e830 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
2e840 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
2e850 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
2e860 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
2e870 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
2e880 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
2e890 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
2e8a0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
2e8b0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
2e8c0 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
2e8d0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
2e8e0 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
2e8f0 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
2e900 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
2e910 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
2e920 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
2e930 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
2e940 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
2e950 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
2e960 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
2e970 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
2e980 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
2e990 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
2e9a0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2e9b0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
2e9c0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2e9d0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
2e9e0 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2e9f0 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
2ea00 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
2ea10 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
2ea20 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
2ea30 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
2ea40 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
2ea50 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2ea60 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
2ea70 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
2ea80 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
2ea90 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
2eaa0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2eab0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2eac0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
2ead0 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
2eae0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
2eaf0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
2eb00 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
2eb10 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
2eb20 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
2eb30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
2eb40 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
2eb50 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
2eb60 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
2eb70 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
2eb80 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2eb90 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
2eba0 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
2ebb0 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
2ebc0 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
2ebd0 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
2ebe0 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
2ebf0 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
2ec00 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
2ec10 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
2ec20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ec30 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2ec40 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
2ec50 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
2ec60 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
2ec70 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
2ec80 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
2ec90 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2eca0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
2ecb0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
2ecc0 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
2ecd0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2ece0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ecf0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
2ed00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ed10 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2ed20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
2ed30 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
2ed40 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
2ed50 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2ed60 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
2ed70 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
2ed80 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
2ed90 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
2eda0 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
2edb0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
2edc0 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
2edd0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2ede0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
2edf0 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
2ee00 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
2ee10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2ee20 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2ee30 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
2ee40 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2ee50 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
2ee60 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
2ee70 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
2ee80 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2ee90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2eea0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
2eeb0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
2eec0 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
2eed0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2eee0 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
2eef0 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
2ef00 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
2ef10 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
2ef20 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
2ef30 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
2ef40 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
2ef50 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75  nearby' */.    u
2ef60 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20  32 nSearch = 0; 
2ef70 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68    /* Count of th
2ef80 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72  e number of sear
2ef90 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20  ch attempts */. 
2efa0 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d     .    /* If eM
2efb0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2efc0 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  CT and a query o
2efd0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
2efe0 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
2eff0 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
2f000 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
2f010 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
2f020 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
2f030 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
2f040 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
2f050 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
2f060 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
2f070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2f080 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
2f090 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2f0a0 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ACT ){.      if(
2f0b0 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
2f0c0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2f0d0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
2f0e0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
2f0f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f100 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2f110 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2f120 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2f130 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
2f140 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2f150 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f160 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
2f170 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
2f180 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
2f190 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2f1a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f1b0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2f1c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2f1d0 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
2f1e0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
2f1f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2f200 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
2f210 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
2f220 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
2f230 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
2f240 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
2f250 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2f260 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
2f270 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
2f280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2f290 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f2a0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2f2b0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2f2c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2f2d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2f2e0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
2f2f0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
2f300 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
2f310 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
2f320 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
2f330 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
2f340 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
2f350 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
2f360 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
2f370 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
2f380 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
2f390 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
2f3a0 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
2f3b0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2f3c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2f3d0 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
2f3e0 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
2f3f0 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
2f400 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2f410 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
2f420 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
2f430 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
2f440 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2f450 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
2f460 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
2f470 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30  DENCE-OF: R-0150
2f480 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73  6-11053 The firs
2f490 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  t integer on a f
2f4a0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2f4b0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ge.        ** is
2f4c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f4d0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
2f4e0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2f4f0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a   in the list or.
2f500 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20          ** zero 
2f510 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  if this is the l
2f520 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ast freelist tru
2f530 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nk page. */.    
2f540 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2f550 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
2f560 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
2f570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f580 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2f590 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38  F: R-59841-13798
2f5a0 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2f5b0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2f5c0 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20  t offset 32.    
2f5d0 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68      ** stores th
2f5e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2f5f0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
2f600 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  of the freelist,
2f610 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20   or zero if.    
2f620 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c      ** the freel
2f630 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ist is empty. */
2f640 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2f650 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f660 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2f670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
2f680 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
2f690 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2f6a0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
2f6b0 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e  e || nSearch++ >
2f6c0 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   n ){.        rc
2f6d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f6e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
2f6f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2f700 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2f710 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
2f720 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
2f730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f740 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
2f750 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2f760 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f770 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f780 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2f790 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20   pTrunk!=0 );.  
2f7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
2f7b0 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a  nk->aData!=0 );.
2f7c0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2f7d0 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34  E-OF: R-13523-04
2f7e0 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69  394 The second i
2f7f0 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2f800 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2f810 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2f820 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  number of leaf p
2f830 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  age pointers to 
2f840 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  follow. */.     
2f850 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
2f860 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2f870 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
2f880 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
2f890 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2f8a0 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
2f8b0 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
2f8c0 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
2f8d0 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
2f8e0 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
2f8f0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2f900 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
2f910 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
2f920 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
2f930 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
2f940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2f950 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
2f960 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f970 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2f980 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2f990 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2f9a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2f9b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f9c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2f9d0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
2f9e0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
2f9f0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2fa00 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2fa10 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2fa20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2fa30 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2fa40 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2fa50 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2fa60 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2fa70 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2fa80 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2fa90 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
2faa0 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
2fab0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2fac0 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
2fad0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
2fae0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
2faf0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
2fb00 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
2fb10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2fb20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2fb30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2fb40 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
2fb50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fb60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2fb70 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
2fb80 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2fb90 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
2fba0 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
2fbb0 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
2fbc0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
2fbd0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2fbe0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
2fbf0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
2fc00 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
2fc10 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
2fc20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
2fc30 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
2fc40 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
2fc50 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
2fc60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
2fc70 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2fc80 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
2fc90 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2fca0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2fcb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2fcc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fcd0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2fce0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fcf0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2fd00 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2fd10 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2fd20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
2fd30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2fd40 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2fd50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2fd60 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
2fd70 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
2fd80 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2fd90 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2fda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2fdb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fdc0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2fdd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fde0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2fdf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fe00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fe10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fe20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2fe30 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2fe40 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
2fe50 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2fe60 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2fe70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fe80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fe90 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2fea0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
2feb0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2fec0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
2fed0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2fee0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
2fef0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
2ff00 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
2ff10 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
2ff20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2ff30 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
2ff40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ff50 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2ff60 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
2ff70 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
2ff80 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2ff90 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
2ffa0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
2ffb0 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
2ffc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
2ffd0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ffe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2fff0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30000 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30020 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
30030 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
30040 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30050 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
30060 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
30070 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
30080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
300a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
300b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
300c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
300d0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
300e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
300f0 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
30100 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30120 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30130 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30140 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
30150 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30160 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30170 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30180 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
30190 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
301a0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
301b0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
301c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
301d0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
301e0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
301f0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
30200 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
30210 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
30220 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
30230 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30240 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
30250 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
30260 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
30270 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30280 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30290 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
302a0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
302b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
302c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
302d0 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
302e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
302f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
30300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30310 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
30320 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30330 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
30340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
30350 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30360 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
30370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30380 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
30390 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
303a0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
303b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
303c0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
303d0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
303e0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
303f0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
30400 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
30410 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
30420 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
30430 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
30440 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
30450 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
30460 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
30470 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
30480 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
30490 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
304a0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
304b0 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
304c0 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  a;.        if( n
304d0 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
304e0 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
304f0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
30500 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
30510 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30520 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LE ){.          
30530 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
30540 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30550 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
30560 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
30570 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4]);.           
30580 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65     if( iPage<=ne
30590 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
305a0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
305b0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
305c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
305d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
305e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
305f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30600 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
30610 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
30620 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  t = sqlite3AbsIn
30630 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
30640 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
30650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
30660 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
30670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30680 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
30690 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
306a0 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
306b0 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
306c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
306d0 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
306e0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
306f0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
30700 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
30710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30720 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
30730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30750 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
30760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
30770 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
30780 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
30790 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
307a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
307b0 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
307c0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
307d0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
307e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
307f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
30800 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30810 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30830 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
30840 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
30850 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
30860 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
30870 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
30880 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
30890 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
308a0 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
308b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
308c0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
308d0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
308e0 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
308f0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
30900 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
30910 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
30920 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
30930 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
30940 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
30950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30960 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
30970 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
30980 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
30990 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
309a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
309b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
309c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
309d0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
309e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
309f0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
30a00 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
30a10 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
30a20 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
30a30 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
30a40 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
30a50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
30a60 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
30a70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
30a80 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
30a90 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
30aa0 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
30ab0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
30ac0 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
30ad0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
30ae0 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
30af0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
30b00 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
30b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30b30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30b40 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
30b50 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
30b60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
30b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
30b90 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
30ba0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30bb0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
30bc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30be0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
30bf0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
30c00 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
30c10 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
30c20 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
30c30 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
30c40 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
30c50 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
30c60 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
30c70 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
30c80 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
30c90 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
30ca0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30cb0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
30cc0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
30cd0 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
30ce0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
30cf0 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
30d00 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
30d10 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
30d20 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
30d30 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
30d40 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
30d50 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
30d60 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
30d70 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
30d80 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
30d90 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
30da0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
30db0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
30dc0 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
30dd0 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
30de0 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
30df0 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
30e00 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
30e10 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
30e20 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
30e30 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
30e40 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
30e50 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
30e60 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
30e70 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
30e80 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
30e90 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
30ea0 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
30eb0 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
30ec0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
30ed0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
30ee0 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
30ef0 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
30f00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
30f10 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
30f20 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
30f30 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
30f40 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
30f50 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
30f60 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
30f70 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
30f80 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
30f90 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
30fa0 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
30fb0 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
30fc0 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
30fd0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
30fe0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
30ff0 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
31000 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
31010 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
31020 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
31030 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
31040 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
31050 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
31060 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
31070 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
31080 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
31090 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
310a0 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
310b0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
310c0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
310d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
310e0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
310f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
31100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31110 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
31120 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
31130 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31140 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
31150 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
31160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31170 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
31180 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31190 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
311a0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
311b0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
311c0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
311d0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
311e0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
311f0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
31200 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
31210 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
31220 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
31230 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
31240 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
31250 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
31260 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
31270 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
31280 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
31290 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
312a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
312b0 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
312c0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
312d0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
312e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
312f0 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
31300 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
31310 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
31320 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31330 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
31340 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
31350 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
31360 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
31370 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
31380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
313a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
313b0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
313c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
313d0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
313e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
313f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31400 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
31410 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
31420 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
31430 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
31440 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
31450 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
31460 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
31470 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
31480 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
31490 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
314a0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
314b0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
314c0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
314d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
314e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
314f0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
31500 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
31510 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
31520 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31530 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
31540 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31550 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
31560 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
31570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31580 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31590 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
315a0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
315b0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
315c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
315d0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
315e0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
315f0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
31600 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
31610 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
31620 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
31630 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
31640 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
31650 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
31660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
31670 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
31680 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
31690 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
316a0 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
316b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
316c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
316d0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
316e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
316f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
31700 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
31710 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
31720 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
31730 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
31740 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
31750 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
31760 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
31770 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
31780 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
31790 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
317a0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
317b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
317c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
317d0 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
317e0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
317f0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
31800 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
31810 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
31820 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
31830 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
31840 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
31850 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
31860 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
31870 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
31880 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
31890 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
318a0 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
318b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
318c0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
318d0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
318e0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
318f0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
31900 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
31910 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
31920 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
31930 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
31940 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
31950 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
31960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31970 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
31980 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
31990 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
319c0 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
319d0 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
319e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
319f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
31a00 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
31a10 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
31a20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
31a30 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
31a40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31a50 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
31a60 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
31a70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
31aa0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
31ab0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31ad0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
31ae0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
31af0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
31b00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31b10 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
31b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
31b30 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
31b40 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
31b50 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
31b60 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
31b70 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
31b80 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53  age<2 ) return S
31b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31ba0 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  PT;.  if( pMemPa
31bb0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
31bc0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
31bd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
31be0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
31bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
31c00 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
31c10 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
31c20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
31c30 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
31c40 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
31c50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
31c60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31c70 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
31c80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
31c90 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31ca0 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
31cb0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
31cc0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
31cd0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
31ce0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
31cf0 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  ;..  if( pBt->bt
31d00 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
31d10 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
31d20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
31d30 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
31d40 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
31d50 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
31d60 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
31d70 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
31d80 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
31d90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
31da0 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
31db0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
31dc0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
31dd0 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
31de0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
31df0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
31e00 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
31e10 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
31e20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31e30 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
31e40 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
31e50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
31e60 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
31e70 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
31e80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
31e90 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
31ea0 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
31eb0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
31ec0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
31ed0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
31ee0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
31ef0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
31f00 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
31f10 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
31f20 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
31f30 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
31f40 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31f50 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
31f60 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
31f70 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
31f80 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
31f90 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
31fa0 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
31fb0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
31fc0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
31fd0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
31fe0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
31ff0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
32000 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
32010 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
32020 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
32030 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
32040 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
32050 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
32060 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
32070 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
32080 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
32090 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
320a0 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
320b0 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
320c0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
320d0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
320e0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
320f0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
32100 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
32110 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
32120 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
32130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32140 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
32150 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
32160 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
32170 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
32180 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32190 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
321a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
321b0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
321c0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
321d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
321e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
321f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
32200 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
32210 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
32220 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
32230 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
32240 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
32250 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
32260 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
32270 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
32280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32290 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
322a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
322b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
322c0 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
322d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
322e0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
322f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32300 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
32310 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
32320 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
32330 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
32340 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
32350 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
32360 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
32370 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
32380 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
32390 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
323a0 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
323b0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
323c0 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
323d0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
323e0 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
323f0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
32400 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
32410 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
32420 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
32430 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
32440 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
32450 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
32460 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
32470 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
32480 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
32490 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
324a0 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
324b0 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
324c0 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
324d0 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
324e0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
324f0 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
32500 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
32510 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
32520 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
32530 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
32540 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
32550 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
32560 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
32570 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
32580 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
32590 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
325a0 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
325b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
325c0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
325d0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
325e0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
325f0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
32600 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
32610 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
32620 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
32630 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
32640 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
32650 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32  DENCE-OF: R-1992
32660 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c  0-11576 However,
32670 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
32680 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a  of SQLite still.
32690 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75        ** avoid u
326a0 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69  sing the last si
326b0 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  x entries in the
326c0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
326d0 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20  page array in.  
326e0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61      ** order tha
326f0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
32700 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65   created by newe
32710 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
32720 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  Lite can be.    
32730 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64    ** read by old
32740 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
32750 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  QLite..      */.
32760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32770 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
32780 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
32790 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
327a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
327b0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
327c0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
327d0 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
327e0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
327f0 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
32800 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
32810 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
32820 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
32830 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
32840 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
32850 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
32860 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
32870 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
32890 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
328a0 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
328b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
328c0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
328d0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
328e0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
328f0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
32900 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
32910 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
32920 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
32930 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
32940 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
32950 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
32960 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
32970 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
32980 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
32990 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
329a0 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
329b0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
329c0 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
329d0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
329e0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
329f0 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
32a00 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
32a10 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
32a20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
32a30 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
32a40 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
32a50 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
32a60 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
32a70 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
32a80 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
32a90 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
32aa0 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
32ab0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
32ac0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
32ad0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
32ae0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
32af0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
32b00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
32b10 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
32b20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
32b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32b40 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
32b50 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
32b60 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
32b70 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
32b80 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
32b90 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
32ba0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
32bb0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
32bc0 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
32bd0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
32be0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
32bf0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
32c00 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
32c10 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
32c20 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
32c30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
32c40 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
32c50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
32c60 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
32c70 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
32c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
32c90 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
32ca0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
32cb0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
32cc0 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
32cd0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
32ce0 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
32cf0 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
32d00 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
32d10 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
32d20 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
32d30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
32d40 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
32d50 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c    Write the.** l
32d60 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28  ocal Cell size (
32d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
32d80 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69  tes on the origi
32d90 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69  nal page, omitti
32da0 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20  ng.** overflow) 
32db0 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f  into *pnSize..*/
32dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
32dd0 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  rCell(.  MemPage
32de0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
32df0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
32e00 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
32e10 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  Cell */.  unsign
32e20 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
32e30 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
32e40 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a   of the Cell */.
32e50 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20    u16 *pnSize   
32e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
32e70 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ite the size of 
32e80 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f  the Cell here */
32e90 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
32ea0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
32eb0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
32ec0 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
32ed0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
32ee0 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32  int nOvfl;.  u32
32ef0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
32f00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32f10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
32f20 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
32f30 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  );.  pPage->xPar
32f40 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
32f50 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a  ell, &info);.  *
32f60 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
32f70 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  ize;.  if( info.
32f80 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f 2e 6e 50 61  nLocal==info.nPa
32f90 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
32fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
32fb0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
32fc0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
32fd0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
32fe0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
32ff0 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a   pCell+info.nSiz
33000 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  e-1 > pPage->aDa
33010 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
33020 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
33030 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33040 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
33050 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
33060 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
33070 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
33080 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 69 6e 66  byte(pCell + inf
33090 6f 2e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  o.nSize - 4);.  
330a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
330b0 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
330c0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
330d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
330e0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
330f0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
33100 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
33110 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
33120 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
33130 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
33140 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
33150 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61  _DB && (info.nPa
33160 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
33170 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
33180 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
33190 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
331a0 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
331b0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
331c0 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
331d0 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
331e0 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
331f0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
33200 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
33210 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
33220 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
33230 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
33240 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
33250 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
33260 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
33270 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
33280 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
33290 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
332a0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
332b0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
332c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
332d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
332e0 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
332f0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
33300 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
33310 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
33320 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
33330 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33340 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
33350 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
33360 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
33370 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
33380 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
33390 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
333a0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
333b0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
333c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
333d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
333e0 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
333f0 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
33400 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
33410 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
33420 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
33430 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
33440 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
33450 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
33460 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
33470 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
33480 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
33490 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
334a0 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
334b0 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
334c0 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
334d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
334e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
334f0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
33500 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
33510 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
33520 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
33530 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
33540 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
33550 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
33560 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
33570 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
33580 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
33590 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
335a0 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
335b0 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
335c0 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
335d0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
335e0 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
335f0 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
33600 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
33610 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
33620 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
33630 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
33640 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
33650 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33660 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
33670 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
33680 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
33690 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
336a0 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
336b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
336c0 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
336d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
336e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
336f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
33700 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
33710 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
33720 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
33730 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
33740 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
33750 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
33760 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
33770 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
33780 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
33790 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
337a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
337b0 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
337c0 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
337d0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
337e0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
337f0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
33800 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
33810 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
33820 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
33830 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
33840 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
33850 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
33860 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
33870 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
33880 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
33890 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
338a0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
338b0 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
338c0 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
338d0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
338e0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
338f0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
33900 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
33910 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
33920 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
33930 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
33940 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
33950 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
33960 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33970 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
33980 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
33990 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
339a0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
339b0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
339c0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
339d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
339e0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
339f0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
33a00 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
33a10 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
33a20 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
33a30 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
33a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
33a50 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
33a60 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
33a70 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
33a80 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
33a90 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
33aa0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
33ab0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
33ac0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
33ad0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
33ae0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
33af0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
33b00 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
33b10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
33b20 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
33b30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
33b40 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
33b50 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
33b60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33b70 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
33b80 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
33b90 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
33ba0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
33bb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33bc0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
33bd0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
33be0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
33bf0 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
33c00 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
33c10 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
33c20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
33c30 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
33c40 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
33c50 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
33c60 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
33c70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
33c80 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
33c90 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
33ca0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
33cb0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
33cc0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
33cd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33ce0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
33cf0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
33d00 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
33d10 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
33d20 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
33d30 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
33d40 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
33d50 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
33d60 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
33d70 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
33d80 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65  ayload);.  }else
33d90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44  {.    assert( nD
33da0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ata==0 );.    as
33db0 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29  sert( nZero==0 )
33dc0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
33dd0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
33de0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
33df0 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a  u64*)&nKey);.  .
33e00 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
33e10 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f   payload size */
33e20 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
33e30 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
33e40 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
33e50 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
33e60 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
33e70 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28  se{ .    assert(
33e80 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66   nKey<=0x7ffffff
33e90 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a  f && pKey!=0 );.
33ea0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
33eb0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
33ec0 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
33ed0 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
33ee0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c  .  }.  if( nPayl
33ef0 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
33f00 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ocal ){.    n = 
33f10 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
33f20 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
33f30 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
33f40 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
33f50 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
33f60 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
33f70 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c   = n;.    spaceL
33f80 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  eft = nPayload;.
33f90 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65      pPrior = pCe
33fa0 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
33fb0 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d   int mn = pPage-
33fc0 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
33fd0 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
33fe0 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
33ff0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
34000 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
34010 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
34020 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
34030 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
34040 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
34050 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50  ;.    if( n > pP
34060 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
34070 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63  n = mn;.    spac
34080 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a  eLeft = n;.    *
34090 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
340a0 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50  ader + 4;.    pP
340b0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
340c0 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20  eader+n];.  }.  
340d0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
340e0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f  l[nHeader];..  /
340f0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
34100 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
34110 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
34120 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
34130 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
34140 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
34150 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
34160 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
34170 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
34180 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
34190 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
341a0 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
341b0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
341c0 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
341d0 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
341e0 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
34200 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
34210 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
34220 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
34230 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
34240 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
34250 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
34260 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
34270 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
34280 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
34290 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
342a0 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
342b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
342c0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
342d0 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
342e0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
342f0 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
34300 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
34310 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
34320 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
34330 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53  ctly..  */.#if S
34340 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
34350 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
34360 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  o;.    pPage->xP
34370 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
34380 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
34390 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
343a0 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70  er==(int)(info.p
343b0 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29  Payload - pCell)
343c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
343d0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
343e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
343f0 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e  pnSize == info.n
34400 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
34410 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d  rt( spaceLeft ==
34420 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a   info.nLocal );.
34430 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
34440 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f   Write the paylo
34450 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ad into the loca
34460 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65  l Cell and any e
34470 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c  xtra into overfl
34480 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68  ow pages */.  wh
34490 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
344a0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
344b0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
344c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
344d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
344e0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
344f0 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
34500 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
34510 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
34520 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
34530 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
34540 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
34550 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
34560 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
34570 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
34580 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
34590 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
345a0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
345b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
345c0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
345d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
345e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
345f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
34600 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
34610 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
34620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34630 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34640 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
34650 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
34660 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
34670 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
34680 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
34690 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
346a0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
346b0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
346c0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
346d0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
346e0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
346f0 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
34700 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
34710 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
34720 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
34730 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
34740 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
34750 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
34760 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
34770 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
34780 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
34790 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
347a0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
347b0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
347c0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
347d0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
347e0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
347f0 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
34800 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
34810 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
34820 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
34830 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
34840 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34850 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
34860 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
34870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34880 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
34890 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
348a0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
348b0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
348c0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
348d0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
348e0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
348f0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
34900 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
34910 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
34920 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
34930 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34940 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
34950 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34960 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
34970 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
34980 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34990 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
349a0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
349b0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
349c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
349d0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
349e0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
349f0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
34a00 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
34a10 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
34a20 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34a30 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34a40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34a50 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
34a60 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
34a70 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
34a80 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34a90 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
34aa0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
34ab0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
34ac0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
34ad0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
34ae0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
34af0 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
34b00 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34b10 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
34b20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
34b30 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34b40 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34b50 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
34b60 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
34b70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
34b80 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
34b90 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
34ba0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
34bb0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
34bc0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
34bd0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
34be0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
34bf0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
34c00 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
34c10 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
34c20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34c30 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
34c40 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
34c50 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
34c60 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
34c70 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
34c80 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
34c90 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
34ca0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
34cb0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
34cc0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
34cd0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
34ce0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
34cf0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
34d00 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
34d10 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
34d20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34d30 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
34d40 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34d50 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
34d60 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
34d70 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
34d80 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
34d90 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
34da0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
34db0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
34dc0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
34dd0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
34de0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
34df0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34e10 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34e20 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34e30 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34e40 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
34e50 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
34e60 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
34e70 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
34e80 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
34e90 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
34ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34eb0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
34ec0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
34ed0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
34ee0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
34ef0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
34f00 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
34f10 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
34f20 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
34f30 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
34f40 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
34f50 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
34f60 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
34f70 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
34f80 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
34f90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
34fa0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
34fb0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
34fc0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
34fd0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
34fe0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
34ff0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
35000 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
35010 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
35020 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
35030 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
35040 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
35050 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
35060 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
35070 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
35080 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
35090 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
350a0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
350b0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
350c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
350d0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
350e0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
350f0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
35100 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
35110 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
35120 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
35130 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
35140 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
35150 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
35160 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
35170 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
35180 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
35190 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
351a0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
351b0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
351c0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
351d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
351e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
351f0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
35200 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
35210 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
35220 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
35230 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
35240 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
35250 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ;..  assert( idx
35260 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
35270 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
35280 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
35290 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  || sz==cellSize(
352a0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
352b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
352c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
352d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
352e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
352f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35300 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35310 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
35320 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
35330 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
35340 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
35350 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
35360 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
35370 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
35380 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
35390 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
353a0 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
353b0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
353c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
353d0 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
353e0 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26   (u32)get2byte(&
353f0 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
35400 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
35410 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
35420 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
35430 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35440 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
35450 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
35460 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
35470 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
35480 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
35490 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
354a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
354b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
354c0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
354d0 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
354e0 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
354f0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
35500 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
35510 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
35520 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
35530 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
35540 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
35550 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
35560 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
35570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35580 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
35590 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
355a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
355b0 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
355c0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
355d0 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
355e0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
355f0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
35600 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
35610 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
35620 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
35630 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
35640 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
35650 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
35660 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
35670 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
35680 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
35690 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
356a0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
356b0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
356c0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
356d0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
356e0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
356f0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
35700 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
35710 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
35720 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
35730 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
35740 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
35750 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
35760 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
35770 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
35780 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
35790 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
357a0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
357b0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
357c0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
357d0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
357e0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
357f0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
35800 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
35810 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
35820 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
35830 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
35840 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  id insertCell(. 
35850 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
35860 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
35870 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
35880 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
35890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
358a0 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
358b0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
358c0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
358d0 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
358e0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
358f0 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
35900 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
35910 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
35920 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
35930 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
35940 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
35950 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
35960 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
35970 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
35980 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld,      /* If n
35990 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
359a0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
359b0 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
359c0 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20  /.  int *pRC    
359d0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e        /* Read an
359e0 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63  d write return c
359f0 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ode from here */
35a00 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20  .){.  int idx = 
35a10 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  0;      /* Where
35a20 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
35a30 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
35a40 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
35a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35a60 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
35a70 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
35a80 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
35a90 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
35aa0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e  age */.  u8 *pIn
35ab0 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s;         /* Th
35ac0 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65  e point in pPage
35ad0 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65  ->aCellIdx[] whe
35ae0 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72  re no cell inser
35af0 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ted */..  if( *p
35b00 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
35b10 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
35b20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
35b30 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58   );.  assert( MX
35b50 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
35b60 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73  )<=10921 );.  as
35b70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
35b80 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
35b90 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55  e->pBt) || CORRU
35ba0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
35bb0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
35bc0 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
35bd0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
35be0 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
35bf0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
35c00 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
35c10 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
35c20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35c30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
35c40 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35c50 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
35c60 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
35c70 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
35c80 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
35c90 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
35ca0 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
35cb0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
35cc0 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
35cd0 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
35ce0 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
35cf0 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
35d00 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
35d10 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
35d20 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
35d30 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
35d40 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
35d50 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
35d60 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
35d70 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
35d80 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
35d90 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
35da0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
35db0 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
35dc0 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d  sert( sz==pPage-
35dd0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
35de0 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
35df0 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
35e00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
35e10 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
35e20 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
35e30 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
35e40 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
35e50 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a  pTemp, pCell, sz
35e60 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
35e70 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
35e80 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
35e90 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
35ea0 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
35eb0 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
35ec0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
35ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28  .    assert( j<(
35ee0 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67  int)(sizeof(pPag
35ef0 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f  e->apOvfl)/sizeo
35f00 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  f(pPage->apOvfl[
35f10 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
35f20 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
35f30 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
35f40 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
35f50 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  6)i;..    /* Whe
35f60 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
35f70 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79  lows occur, they
35f80 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71 75   are always sequ
35f90 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20  ential and in.  
35fa0 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
35fb0 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  r.  This invaria
35fc0 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75 73  nts arise becaus
35fd0 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  e multiple overf
35fe0 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20  lows can.    ** 
35ff0 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
36000 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64 65  inserting divide
36010 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  r cells into the
36020 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75 72   parent page dur
36030 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e  ing.    ** balan
36040 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69  cing, and the di
36050 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61 63  viders are adjac
36060 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a  ent and sorted..
36070 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
36080 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65  t( j==0 || pPage
36090 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75  ->aiOvfl[j-1]<(u
360a0 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66  16)i ); /* Overf
360b0 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f  lows in sorted o
360c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  rder */.    asse
360d0 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70  rt( j==0 || i==p
360e0 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
360f0 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72  ]+1 );   /* Over
36100 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e  flows are sequen
36110 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  tial */.  }else{
36120 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
36130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36140 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
36150 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36170 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
36180 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
36190 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
361a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
361b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
361c0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
361d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
361e0 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61     assert( &data
361f0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
36200 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c  et]==pPage->aCel
36210 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d  lIdx );.    rc =
36220 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
36230 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
36240 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
36250 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
36260 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
36270 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
36280 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
36290 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
362a0 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
362b0 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
362c0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a  successfully */.
362d0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
362e0 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
362f0 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65  rt( idx >= pPage
36300 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
36310 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c  Page->nCell+2 ||
36320 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
36330 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
36340 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
36350 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36360 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
36370 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
36380 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
36390 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
363a0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
363b0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
363c0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
363d0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
363e0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d      }.    pIns =
363f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
36400 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d   + i*2;.    memm
36410 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73  ove(pIns+2, pIns
36420 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
36430 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74  l - i));.    put
36440 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29  2byte(pIns, idx)
36450 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
36460 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63  ll++;.    /* inc
36470 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20  rement the cell 
36480 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  count */.    if(
36490 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e   (++data[pPage->
364a0 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30  hdrOffset+4])==0
364b0 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68   ) data[pPage->h
364c0 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20  drOffset+3]++;. 
364d0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
364e0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
364f0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
36500 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
36510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36520 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36530 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
36540 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
36550 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
36560 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
36570 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
36580 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
36590 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
365a0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
365b0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
365c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
365d0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
365e0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
365f0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
36600 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
36610 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
36620 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72  ../*.** A CellAr
36630 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
36640 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20 70  ins a cache of p
36650 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65  ointers and size
36660 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65  s for a.** conse
36670 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65 20  cutive sequence 
36680 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69  of cells that mi
36690 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c 74  ght be held mult
366a0 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74  iple pages..*/.t
366b0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65  ypedef struct Ce
366c0 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61  llArray CellArra
366d0 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72  y;.struct CellAr
366e0 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c  ray {.  int nCel
366f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
36700 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
36710 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
36720 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65  /.  MemPage *pRe
36730 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  f;          /* R
36740 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f  eference page */
36750 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
36760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
36770 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
36780 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
36790 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
367a0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
367b0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
367c0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b  n apCell[] */.};
367d0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
367e0 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73  e the cell sizes
367f0 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20   at idx, idx+1, 
36800 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76  ..., idx+N-1 hav
36810 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74  e been.** comput
36820 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
36830 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43  id populateCellC
36840 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  ache(CellArray *
36850 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  p, int idx, int 
36860 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  N){.  assert( id
36870 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70  x>=0 && idx+N<=p
36880 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69  ->nCell );.  whi
36890 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61  le( N>0 ){.    a
368a0 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c  ssert( p->apCell
368b0 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20  [idx]!=0 );.    
368c0 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64  if( p->szCell[id
368d0 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  x]==0 ){.      p
368e0 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20  ->szCell[idx] = 
368f0 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
36900 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
36910 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20  pCell[idx]);.   
36920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
36930 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
36940 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
36950 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d    p->szCell[idx]
36960 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  ==p->pRef->xCell
36970 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
36980 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b  >apCell[idx]) );
36990 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b  .    }.    idx++
369a0 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d  ;.    N--;.  }.}
369b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
369c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e  he size of the N
369d0 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  th element of th
369e0 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a  e cell array.*/.
369f0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
36a00 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75  INLINE u16 compu
36a10 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41  teCellSize(CellA
36a20 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  rray *p, int N){
36a30 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20  .  assert( N>=0 
36a40 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b  && N<p->nCell );
36a50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a  .  assert( p->sz
36a60 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20  Cell[N]==0 );.  
36a70 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70  p->szCell[N] = p
36a80 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
36a90 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
36aa0 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75  Cell[N]);.  retu
36ab0 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
36ac0 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 61  .}.static u16 ca
36ad0 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c  chedCellSize(Cel
36ae0 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e  lArray *p, int N
36af0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  ){.  assert( N>=
36b00 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20  0 && N<p->nCell 
36b10 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  );.  if( p->szCe
36b20 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70  ll[N] ) return p
36b30 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72  ->szCell[N];.  r
36b40 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c  eturn computeCel
36b50 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a  lSize(p, N);.}..
36b60 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
36b70 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
36b80 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20  inters to nCell 
36b90 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c  b-tree page cell
36ba0 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c  s. The .** szCel
36bb0 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  l[] array contai
36bc0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
36bd0 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c  ytes of each cel
36be0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
36bf0 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65  .** replaces the
36c00 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
36c10 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69  s of page pPg wi
36c20 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
36c30 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61  of the cell.** a
36c40 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rray..**.** Some
36c50 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
36c60 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75   apCell[] may cu
36c70 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
36c80 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a  d in pPg. This.*
36c90 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  * function works
36ca0 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
36cb0 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20   caused by this 
36cc0 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  by making a copy
36cd0 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68   of any .** such
36ce0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76   cells before ov
36cf0 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61  erwriting the pa
36d00 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  ge data..**.** T
36d10 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65  he MemPage.nFree
36d20 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
36d30 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  dated by this fu
36d40 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68  nction. It is th
36d50 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
36d60 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
36d70 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72  er to set it cor
36d80 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
36d90 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67  c int rebuildPag
36da0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
36db0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
36dc0 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69       /* Edit thi
36dd0 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
36de0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
36df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
36e00 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  inal number of c
36e10 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ells on page */.
36e20 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
36e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e40 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
36e50 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
36e60 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
36e70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
36e80 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
36e90 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
36ea0 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
36eb0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
36ec0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
36ed0 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ader on pPg */. 
36ee0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
36ef0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20  a = pPg->aData; 
36f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
36f10 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
36f20 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   pPg */.  const 
36f30 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
36f40 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
36f50 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f  eSize;.  u8 * co
36f60 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
36f70 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
36f80 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43   int i;.  u8 *pC
36f90 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
36fa0 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54  ellIdx;.  u8 *pT
36fb0 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
36fc0 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e  rTempSpace(pPg->
36fd0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
36fe0 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20  u8 *pData;..  i 
36ff0 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
37000 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
37010 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61  cpy(&pTmp[i], &a
37020 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53  Data[i], usableS
37030 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61  ize - i);..  pDa
37040 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72  ta = pEnd;.  for
37050 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
37060 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
37070 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a  ll = apCell[i];.
37080 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57      if( SQLITE_W
37090 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74  ITHIN(pCell,aDat
370a0 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20  a,pEnd) ){.     
370b0 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
370c0 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
370d0 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d     }.    pData -
370e0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = szCell[i];.   
370f0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
37100 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61  tr, (pData - aDa
37110 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
37120 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28  tr += 2;.    if(
37130 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74   pData < pCellpt
37140 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
37150 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
37160 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
37170 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b  , pCell, szCell[
37180 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i]);.    assert(
37190 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d   szCell[i]==pPg-
371a0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20  >xCellSize(pPg, 
371b0 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
371c0 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74  T_DB );.    test
371d0 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21  case( szCell[i]!
371e0 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
371f0 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20  pPg,pCell) );.  
37200 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
37210 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
37220 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
37230 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
37240 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
37250 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
37260 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
37270 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
37280 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
37290 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
372a0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
372b0 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
372c0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
372d0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
372e0 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
372f0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
37300 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
37310 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
37320 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
37330 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f  ontains nCell po
37340 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65  inters to b-tree
37350 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a   cells. Array sz
37360 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  Cell.** contains
37370 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37380 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
37390 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
373a0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
373b0 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c  .** add the cell
373c0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
373d0 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50  array to page pP
373e0 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20  g. If it cannot 
373f0 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  (because .** the
37400 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
37410 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62  e defragmented b
37420 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20  efore the cells 
37430 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a  will fit), non-z
37440 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
37450 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
37460 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  f the cells are 
37470 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
37480 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72  ly, zero is.** r
37490 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
374a0 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72  rgument pCellptr
374b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
374c0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
374d0 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
374e0 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66  rray.** (part of
374f0 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f   page pPg) to po
37500 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65  pulate. After ce
37510 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20  ll apCell[0] is 
37520 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
37530 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31  * page body, a 1
37540 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20  6-bit offset is 
37550 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c  written to pCell
37560 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20  ptr. And so on, 
37570 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c  for each.** cell
37580 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49   in the array. I
37590 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
375a0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
375b0 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a  aller to ensure.
375c0 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61  ** that it is sa
375d0 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  fe to overwrite 
375e0 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
375f0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
37600 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ray..**.** When 
37610 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
37620 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61   called, *ppData
37630 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
37640 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tart of the .** 
37650 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20  content area on 
37660 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65  page pPg. If the
37670 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e   size of the con
37680 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74  tent area is ext
37690 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74  ended,.** *ppDat
376a0 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  a is updated to 
376b0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
376c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f   start of the co
376d0 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65  ntent area.** be
376e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
376f0 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61  **.** Finally, a
37700 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70  rgument pBegin p
37710 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74  oints to the byt
37720 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
37730 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
37740 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65 20  nd of the space 
37750 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
37760 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63 65   page for the ce
37770 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
37780 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c  (for.** all cell
37790 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f  s - not just tho
377a0 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20 74  se inserted by t
377b0 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29  he current call)
377c0 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  . If the content
377d0 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65  .** area must be
377e0 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66   extended to bef
377f0 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ore this point i
37800 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d  n order to accom
37810 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c  odate all.** cel
37820 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20  ls in apCell[], 
37830 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64  then the cells d
37840 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f  o not fit and no
37850 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
37860 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
37870 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  t pageInsertArra
37880 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
37890 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
378a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
378b0 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a  add cells to */.
378c0 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20    u8 *pBegin,   
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378e0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c    /* End of cell
378f0 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a  -pointer array *
37900 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c  /.  u8 **ppData,
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37920 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
37930 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65  age content -are
37940 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  a pointer */.  u
37950 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20  8 *pCellptr,    
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37970 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c  * Pointer to cel
37980 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a  l-pointer area *
37990 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
379a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
379c0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61 64  first cell to ad
379d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
379e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
379f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37a00 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
37a10 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c   to pPg */.  Cel
37a20 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20  lArray *pCArray 
37a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37a40 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
37a50 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
37a60 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67 2d  u8 *aData = pPg-
37a70 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 44  >aData;.  u8 *pD
37a80 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20  ata = *ppData;. 
37a90 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72   int iEnd = iFir
37aa0 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73  st + nCell;.  as
37ab0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
37ac0 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66 73   || pPg->hdrOffs
37ad0 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  et==0 );    /* N
37ae0 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ever called on p
37af0 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69  age 1 */.  for(i
37b00 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b  =iFirst; i<iEnd;
37b10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73   i++){.    int s
37b20 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a 70  z, rc;.    u8 *p
37b30 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63  Slot;.    sz = c
37b40 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70 43  achedCellSize(pC
37b50 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20 69  Array, i);.    i
37b60 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20  f( (aData[1]==0 
37b70 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20  && aData[2]==0) 
37b80 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67 65  || (pSlot = page
37b90 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c  FindSlot(pPg,sz,
37ba0 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  &rc))==0 ){.    
37bb0 20 20 69 66 28 20 28 70 44 61 74 61 20 2d 20 70    if( (pData - p
37bc0 42 65 67 69 6e 29 3c 73 7a 20 29 20 72 65 74 75  Begin)<sz ) retu
37bd0 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 44 61 74  rn 1;.      pDat
37be0 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  a -= sz;.      p
37bf0 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20  Slot = pData;.  
37c00 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74    }.    /* pSlot
37c10 20 61 6e 64 20 70 43 41 72 72 61 79 2d 3e 61 70   and pCArray->ap
37c20 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76  Cell[i] will nev
37c30 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20  er overlap on a 
37c40 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20  well-formed.    
37c50 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  ** database.  Bu
37c60 74 20 74 68 65 79 20 6d 69 67 68 74 20 66 6f 72  t they might for
37c70 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
37c80 61 73 65 2e 20 20 48 65 6e 63 65 20 75 73 65 20  ase.  Hence use 
37c90 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a  memmove().    **
37ca0 20 73 69 6e 63 65 20 6d 65 6d 63 70 79 28 29 20   since memcpy() 
37cb0 73 65 6e 64 73 20 53 49 47 41 42 4f 52 54 20 77  sends SIGABORT w
37cc0 69 74 68 20 6f 76 65 72 6c 61 70 70 69 6e 67 20  ith overlapping 
37cd0 62 75 66 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42  buffers on OpenB
37ce0 53 44 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  SD */.    assert
37cf0 28 20 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43  ( (pSlot+sz)<=pC
37d00 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37d10 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 53 6c  .         || pSl
37d20 6f 74 3e 3d 28 70 43 41 72 72 61 79 2d 3e 61 70  ot>=(pCArray->ap
37d30 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20  Cell[i]+sz).    
37d40 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
37d50 44 42 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76  DB );.    memmov
37d60 65 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61 79  e(pSlot, pCArray
37d70 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  ->apCell[i], sz)
37d80 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
37d90 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20  Cellptr, (pSlot 
37da0 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37db0 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37dc0 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44  }.  *ppData = pD
37dd0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ata;.  return 0;
37de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
37df0 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
37e00 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73  s nCell pointers
37e10 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73   to b-tree cells
37e20 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a  . Array szCell .
37e30 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37e40 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
37e50 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e   each such cell.
37e60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
37e70 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  dds the.** space
37e80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
37e90 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68   each cell in th
37ea0 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  e array that is 
37eb0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
37ec0 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20   .** within the 
37ed0 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74  body of pPg to t
37ee0 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74  he pPg free-list
37ef0 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  . The cell-point
37f00 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a  ers and other.**
37f10 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70   fields of the p
37f20 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61  age are not upda
37f30 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
37f40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
37f50 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
37f60 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64  r of cells added
37f70 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
37f80 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
37f90 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a   pageFreeArray(.
37fa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fc0 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69    /* Page to edi
37fd0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  t */.  int iFirs
37fe0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
37ff0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
38000 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
38010 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
38020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38030 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20      /* Cells to 
38040 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c  delete */.  Cell
38050 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20  Array *pCArray  
38060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
38070 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
38080 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  .){.  u8 * const
38090 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
380a0 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ata;.  u8 * cons
380b0 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b  t pEnd = &aData[
380c0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
380d0 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f  Size];.  u8 * co
380e0 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44  nst pStart = &aD
380f0 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73  ata[pPg->hdrOffs
38100 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68  et + 8 + pPg->ch
38110 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69  ildPtrSize];.  i
38120 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69  nt nRet = 0;.  i
38130 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64  nt i;.  int iEnd
38140 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
38150 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  l;.  u8 *pFree =
38160 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65   0;.  int szFree
38170 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69   = 0;..  for(i=i
38180 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69  First; i<iEnd; i
38190 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
381a0 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61 70  ll = pCArray->ap
381b0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
381c0 20 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70   SQLITE_WITHIN(p
381d0 43 65 6c 6c 2c 20 70 53 74 61 72 74 2c 20 70 45  Cell, pStart, pE
381e0 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nd) ){.      int
381f0 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f   sz;.      /* No
38200 20 6e 65 65 64 20 74 6f 20 75 73 65 20 63 61 63   need to use cac
38210 68 65 64 43 65 6c 6c 53 69 7a 65 28 29 20 68 65  hedCellSize() he
38220 72 65 2e 20 20 54 68 65 20 73 69 7a 65 73 20 6f  re.  The sizes o
38230 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74  f all cells that
38240 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74 6f  .      ** are to
38250 20 62 65 20 66 72 65 65 64 20 68 61 76 65 20 61   be freed have a
38260 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
38270 75 74 69 6e 67 20 77 68 69 6c 65 20 64 65 63 69  uting while deci
38280 64 69 6e 67 20 77 68 69 63 68 0a 20 20 20 20 20  ding which.     
38290 20 2a 2a 20 63 65 6c 6c 73 20 6e 65 65 64 20 66   ** cells need f
382a0 72 65 65 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  reeing */.      
382b0 73 7a 20 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a  sz = pCArray->sz
382c0 43 65 6c 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74  Cell[i];  assert
382d0 28 20 73 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20  ( sz>0 );.      
382e0 69 66 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c  if( pFree!=(pCel
382f0 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20  l + sz) ){.     
38300 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
38310 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
38320 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26  ( pFree>aData &&
38330 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29   (pFree - aData)
38340 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
38350 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50      freeSpace(pP
38360 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d  g, (u16)(pFree -
38370 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29   aData), szFree)
38380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38390 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c      pFree = pCel
383a0 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65  l;.        szFre
383b0 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  e = sz;.        
383c0 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e  if( pFree+sz>pEn
383d0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
383e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
383f0 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c     pFree = pCell
38400 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65  ;.        szFree
38410 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a   += sz;.      }.
38420 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20        nRet++;.  
38430 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46    }.  }.  if( pF
38440 72 65 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ree ){.    asser
38450 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26  t( pFree>aData &
38460